WSL 에서 CUDA 사용을 위한 User Guide

CUDA on WSL User Guide

2021/12/05 일 현재

1. WSL 이란

네이티브 리눅스 앱을 Windows 11 and later OS build 에서 실행할 수 있는 Windows Subsystem for Linux 이다.

WSL 1 vs. WSL 2

WSL2 is the second generation of WSL that offers the following benefits:

  • Linux applications can run as is in WSL2. WSL 2 is characteristically a VM with a Linux WSL Kernel in it that provides full compatibility with mainstream Linux kernel allowing support for native Linux applications including popular Linux distros.

  • Faster file system support and that’s more performant.

  • WSL 2 is tightly integrated with the Microsoft Windows operating system, which allows it to run Linux applications alongside and even interop with other Windows desktop and modern store apps.

2. NVIDIA GPU Accelerated Computing on WSL 2

WSL 2에서 마이크로소프트는 NVIDIA CUDA 및 기타 컴퓨팅 프레임워크와 기술과 함께 데이터 과학, 머신러닝 및 추론 솔루션을 위한 GPU 가속 컴퓨팅을 가능하게 하는 GPU 반가상화 기술을 도입했다. WSL 유사 환경 또는 WSL 2에서 CPU 개입을 줄이면서 GPU에서 더 많은 병렬 작업을 파이프라인으로 수행할 수 있으므로 거의 네이티브에 가까운 성능을 제공한다. NVIDIA 드라이버 지원은 CUDA 및 관련 컴퓨팅 소프트웨어 스택에서 멈추지 않습니다. 다이렉트 ML 지원과 함께 DX12 API를 지원하여 WSL 2에서 그래픽을 활성화하는 DirectX 지원이 있습니다.

Illustration of the possibilities with NVIDIA CUDA software stack on WSL 2

3. WSL2 시작

WSL2 요구사항

  • Geforce, Quadro 제품 계열에서 Pascal 또는 최신 GPU 구조를 WDDM모드로 SKU를 사용할 수 있다.
  • 최신 WSL 커널 로 5.10.16.3 이상을 권장한다. (최소 4.19.121+ 이상)
  • Windows 11 에서는 윈도우 인사이더 프로그램 가입이 필요 없다.
  • Windows 10 에서는 윈도우 인사이더 프리뷰 프로그램이 필요하다.

Step 1: Install NVIDIA Driver for GPU Support

윈도우 11 그래픽 드라이버로 NVIDIA GeForce Game Ready or NVIDIA RTX Quadro 를 설치한다.

3.3. Step 2: Install WSL 2

윈도우 터미널 / 커맨드 라인 / 파워쉘 에서 WSL을 설치

1
wsl.exe --install

Ensure you have the latest WSL kernel:

1
wsl.exe --update

3.4. Setting Up a Linux Development Environment

기본으로 WSL2는 Ubuntu 가 설치되어 온다. 다른 배포본은 MS store에서 설치. wsl 시작.

1
wsl.exe

업데이트를 위한 WSL 명령:

4. Getting Started with CUDA on WSL 2

WSL2에서 CUDA 를 지원하려면 CUDA Toolkit이 설치되고 cuDNN도 설치해야 한다.

4.1 WSL에서 CUDA Toolkit을 설치한다

WSL 2 에서 CUDA application을 실행하려면 CUDA toolkit for Linux 를 설치해야 한다.

CUDA Toolkit 11.5 를 다운로드하고 설치한다.

1
2
3
4
5
6
7
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.5.1/local_installers/cuda-repo-wsl-ubuntu-11-5-local_11.5.1-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-11-5-local_11.5.1-1_amd64.deb
sudo apt-key add /var/cuda-repo-wsl-ubuntu-11-5-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

4.2 cudnn 설치

CUDA Toolkit 버전에 대응하는 cuDNN 을 설치해야 한다.

1
2
3
sudo apt install libcudnn8
sudo apt install libcudnn8-dev
sudo apt-get install libcudnn8-samples

4.3 CUDA 애플리케이션

윈도우에 CUDA 애프리케이션이 있아면 다음 같이 WSL에서 실행해 보자

1
2
3
$ cd /mnt/c/Users/<username>/Desktop
$ cp /mnt/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.5/extras/demo_suite/deviceQuery.exe ~/
$ ./deviceQuery.exe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(tf25gpu_p39)~$ nvidia-smi
Sun Dec 5 02:29:22 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.00 Driver Version: 510.06 CUDA Version: 11.6 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... On | 00000000:09:00.0 On | N/A |
| 0% 43C P8 20W / 320W | 1179MiB / 11264MiB | N/A Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+

4.4 Building CUDA Samples

CUDA 샘플을 빌드해서 실행해 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
(tf25gpu_p39)/usr/local/cuda-11.5/samples/4_Finance/BlackScholes$ ./BlackScholes
[./BlackScholes] - Starting...
GPU Device 0: "Pascal" with compute capability 6.1

Initializing data...
...allocating CPU memory for options.
...allocating GPU memory for options.
...generating input data in CPU mem.
...copying input data to GPU mem.
Data init done.

Executing Black-Scholes GPU kernel (512 iterations)...
Options count : 8000000
BlackScholesGPU() time : 0.234201 msec
Effective memory bandwidth: 341.586668 GB/s
Gigaoptions per second : 34.158667

BlackScholes, Throughput = 34.1587 GOptions/s, Time = 0.00023 s, Size = 8000000 options, NumDevsUsed = 1, Workgroup = 128

Reading back GPU results...
Checking the results...
...running CPU calculations.

Comparing the results...
L1 norm: 1.741792E-07
Max absolute error: 1.192093E-05

Shutting down...
...releasing GPU memory.
...releasing CPU memory.
Shutdown done.

[BlackScholes] - Test Summary

NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.

Test passed
(tf25gpu_p39)/usr/local/cuda-11.5/samples/4_Finance/BlackScholes$

참고

[Open API] OpenweatherMap Open API

OpenweatherMap

날씨 정보를 제공하는 OpenAPI로 APi key를 발급받아 사용한다.

https://www.openweathermap.org/

Usage

OpenWeatherMap은 API 호출시 API Key를 APPID 파라미터로 전달한다. 예를 들어 서울의 날씨를 얻으려면

1
2
api.openweathermap.org/data/2.5/weather?q={city name}
api.openweathermap.org/data/2.5/weather?q={city name},{country code}

그러나 한 API Key로 10분에 1번 호출 해야 한다.

API Key

4ecbcfa0c4210bfff11d93ea02cd9290

1
http://api.openweathermap.org/data/2.5/weather?q=seoul,kr&appid=4ecbcfa0c4210bfff11d93ea02cd9290

API 가입

https://openweathermap.org/api 에서 원하는 API를 골라 Subscribe 한 후에 사용할 수 있다. 가입 자격에 따라서 API 호출 빈도가 달라진다.

Weather data

JSON
Example of API respond:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{
"coord": {
"lon": 126.98,
"lat": 37.57
},
"weather": [
{
"id": 701,
"main": "Mist",
"description": "mist",
"icon": "50n"
}
],
"base": "stations",
"main": {
"temp": 276.15,
"pressure": 1013,
"humidity": 64,
"temp_min": 276.15,
"temp_max": 276.15
},
"visibility": 11265,
"wind": {
"speed": 5.7,
"deg": 310
},
"clouds": {
"all": 90
},
"dt": 1523044560,
"sys": {
"type": 1,
"id": 7673,
"message": 0.0075,
"country": "KR",
"sunrise": 1522962579,
"sunset": 1523008779
},
"id": 1835848,
"name": "Seoul",
"cod": 200
}

Parameters:

  • coord
    • coord.lon City geo location, longitude
    • coord.lat City geo location, latitude
  • weather (more info Weather condition codes)
    • weather.id Weather condition id
    • weather.main Group of weather parameters (Rain, Snow, Extreme etc.)
    • weather.description Weather condition within the group
    • weather.icon Weather icon id
  • base Internal parameter
    main
    main.temp Temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit.
    main.pressure Atmospheric pressure (on the sea level, if there is no sea_level or grnd_level data), hPa
    main.humidity Humidity, %
    main.temp_min Minimum temperature at the moment. This is deviation from current temp that is possible for large cities and megalopolises geographically expanded (use these parameter optionally). Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit.
    main.temp_max Maximum temperature at the moment. This is deviation from current temp that is possible for large cities and megalopolises geographically expanded (use these parameter optionally). Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit.
    main.sea_level Atmospheric pressure on the sea level, hPa
    main.grnd_level Atmospheric pressure on the ground level, hPa
    wind
    wind.speed Wind speed. Unit Default: meter/sec, Metric: meter/sec, Imperial: miles/hour.
    wind.deg Wind direction, degrees (meteorological)
    clouds
    clouds.all Cloudiness, %
    rain
    rain.3h Rain volume for the last 3 hours
    snow
    snow.3h Snow volume for the last 3 hours
    dt Time of data calculation, unix, UTC
    sys
    sys.type Internal parameter
    sys.id Internal parameter
    sys.message Internal parameter
    sys.country Country code (GB, JP etc.)
    sys.sunrise Sunrise time, unix, UTC
    sys.sunset Sunset time, unix, UTC
    id City ID
    name City name
    cod Internal parameter

[Open API] REST Architecture 요약

REST Architecture

Oracle 에서 발표한 자료에서 설명한 내용을 정리한다.

Deview 2017 “그런 REST API로 괜찮은가”

Deview 2017 “그런 REST API로 괜찮은가” 발표자료

RESTFull API

RESEFull API는 기술적으로 다음 같이 발전해 왔다.

HTTP/1.0 1994-1996

Roy T. Fielding, HTTP Object Model

“How do i improve HTTP without breaking the Web?”

REST 1998

Roy T. Fielding, Microsoft Research 발표

“Representational State Transfer:
An Architectural Style for Distributed Hypermedia Interaction”

REST 2000

Roy T. Fielding, 박사 논문으로 발표

“Architectural Styles and the Design of Network-based Software Architectures”

이 기술의 근간은 Web API 이다.


SOAP

Micsoft에서도 XML-RPC 1998를 통해 Web API를 구현하고자 했다.

Microsoft, SOAP

Salesforce API

Salesforce API, 2000 은 이런 방식을 처음 도입했다.
https://web.archive.org/web/20001018092215/http://salesforce.com/

flickr API

flickr의 SOAP

https://web.archive.org/web/20040921173223/http://www.flickr.com:80/services/api/response.soap.html

flickr의 REST API

https://web.archive.org/web/20040821031039/http://www.flickr.com:80/services/api/response.rest.html

SOAP과 REST
SOAP REST
- 복잡하다 - 단순하다
- 규칙 많음 - 규칙 적다
- 어렵다 - 쉽다

Google trends 검색

2006년, AWS가 자사 API의 85%를 REST로 구현
2010년, Salesforce.com에서 REST API 추가

CMIS

2008년 CMIS 표준 준비

그러나 Roy T. Fielding: “No REST in CMIS”

REST API guideline

2016년 Microsft 가 제시한 REST API Guideline

Roy T. Fielding:
“s/REST API/HTTP API/“

http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

그리고

“REST API를 위한 최고의 버저닝 전략은 버저닝을 안 하는 것”

결국 REST API는

  • REST 아키텍쳐 스타일을 따르는 API
  • 분산 하이퍼미디어 시스템(예: 웹)을 위한 아키텍쳐 스타일
  • 아키텍쳐 스타일: 제약조건의 집합

REST 를 구성하는 스타일

아키텍쳐 스타일 은 다음 같이 구성된다:

  • client-server
  • stateless
  • cache
  • uniform interface
  • layered system
  • code-on-demand (optional)
Uniform interface

Uniform Interface

  • identification of resources
  • manipulation of resources through representations
  • self-descriptive messages
  • hypermedia as the engine of application state (HATEOAS)
Self descriptive message

Self-descriptive message, 메시지는 스스로를 설명해야한다

1
GET / HTTP/1.1

이 HTTP 요청 메시지는 뭔가 빠져있어서 self-descriptive 하지 못하다.

목적지를 추가하면 이제 self-descriptive

1
2
GET / HTTP/1.1
Host: www.example.org

결과 메시지도

1
2
3
HTTP/1.1 200 OK

[ { "op": "remove", "path": "/a/b/c" } ]
1
2
3
4
HTTP/1.1 200 OK
Content-Type: application/json-patch+json

[ { "op": "remove", "path": "/a/b/c" } ]
HATEOAS

애플리케이션의 상태는 Hyperlink를 이용해 전이되어야한다.
http://slides.com/eungjun/rest#/37

독립성

서버와 클라이언트가 각각 독립적으로 진화한다.
서버의 기능이 변경되어도 클라이언트를 업데이트할 필요가 없다.
REST를 만들게 된 계기: “How do I improve HTTP without breaking the Web.”

호환성 유지

HTML5 첫 초안에서 권고안 나오는데까지 6년

  • HTML5 드래프트 2008년 1월, 첫 권고안 2014년 10월

HTTP/1.1 명세 개정판 작업하는데 7년

  • HTTP/1.1 명세 세 번째 개정판인 RFC 7230-7235의 작업기간 2007년 12월 - 2014년 6월

상호운용성에 대한 집착

Referer 오타지만 안 고침

Referer의 개념을 Tim Berners Lee에게 제안한 것은 Phillip M. Hallam-Baker 이지만, 이름까지 정해서 주지는 않았다고 한다. 따라서 오타를 만든 것은 Tim Berners Lee인 것으로 추정하는듯.

See https://lists.w3.org/Archives/Public/ietf-http-wg-old/1995JanApr/0109.htm

charset 잘못 지은 이름이지만 안 고침

charset은 “character set”이 아님에도 불구하고 그런 오해를 계속해서 불러일으키고 있다.

http://w3-org.9356.n7.nabble.com/How-to-pronounce-quot-charset-quot-td254585.html#message254629

HTTP 상태 코드 418 포기함 (I’m a teapot)

https://www.facebook.com/eungjun/posts/10213901564392694

HTTP/0.9 아직도 지원함 (크롬, 파이어폭스)

구글 크롬에서 HTTP/0.9 지원을 완전히 제거하려다 실패했다. Tenda D301 router와의 호환성이 깨지는 문제가 발견되어서. default port인 경우에만 HTTP/0.9를 지원하도록 하려고 했는데 그마저도 문제가 발견되어 revert했다:
https://bugs.chromium.org/p/chromium/issues/detail?id=624462

REST가 웹의 독립적 진화에 도움을 주었나
  • HTTP에 지속적으로 영향을 줌
  • Host 헤더 추가
  • 길이 제한을 다루는 방법이 명시 (414 URI Too Long 등)
  • URI에서 리소스의 정의가 추상적으로 변경됨: “식별하고자 하는 무언가”
  • 기타 HTTP와 URI에 많은 영향을 줌
  • HTTP/1.1 명세 최신판에서 REST에 대한 언급이 들어감
  • Reminder: Roy T. Fielding이 HTTP와 URI 명세의 저자 중 한명입니다

그럼 REST는 성공했는가

  • REST는 웹의 독립적 진화를 위해 만들어졌다
  • 웹은 독립적으로 진화하고 있다
  • 성공!

그런데 REST API는?
REST API는 REST 아키텍쳐 스타일을 따라야한다.
오늘날 스스로 REST API라고 하는 API들의 대부분이 REST 아키텍쳐 스타일을 따르지 않는다.

REST 스타일 가이드를 따랴야 한다.링크

An API that provides network-based access to resources via a uniform interface of self-descriptive messages containing hypertext to indicate potential state transitions might be part of an overall system that is a RESTful application
– Roy T. Fielding

구현이 쉽지는 않다.

원격 API가 REST API여야 하나?

시스템 전체를 통제할 수 있다고 생각하거나, 진화에 관심이 없다면, REST에 대해 따지느라 시간을 낭비하지 마라

링크

REST emphasizes evolvability to sustain an uncontrollable system. If you think you have control over the system or aren’t interested in evolvability, don’t waste your time arguing about REST.
– Roy T. Fielding

현재는

(1) REST API를 구현하고 REST API라고 부른다.
(2) REST API 구현을 포기하고 HTTP API라고 부른다.
(3) REST API가 아니지만 REST API라고 부른다. (현재 상태)

그러므로 제약 조건을 따르던지 다른 단어를 써라!!!

I am getting frustrated by the number of people calling any HTTP-based interface a REST API. … Please try to adhere to them or choose some other buzzword for your API.
– Roy T. Fielding

일반 Web과 REST API 비교

http://slides.com/eungjun/rest#/63

open api spec

https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md

[Open API] Alading Bookstore Open API

Aladin Open API

키 인증 방식으로 일반 1일 호출 5000회 가능하다.

http://blog.aladin.co.kr/openapi/category/29154404?communitytype=MyPaper

TTB 가입 방법

여기 http://www.aladdin.co.kr/ttb/wjoinus.aspx 에서 TTB 가입한다. 승인 완료되면 TTB Key값이 발급된다.

TTB Key값은 http://www.aladin.co.kr/ttb/wblog_manage.aspx 이 페이지에서 조회하실 수 있습니다. 이 키값은 OPENAPI 키값으로 사용됩니다.

상품 API

여기 http://blog.aladin.co.kr/openapi/category/29154402?communitytype=MyPaper 설명되어 있다.

  • 제공 리스트 종류
  • 신간 전체 리스트
  • 주목한 만한 신간 리스트
  • 편집자 추천 리스트(카테고리로만 조회 가능 - 국내도서/음반/외서 만 지원)
  • 베스트셀러
  • 북플 베스트셀러(국내도서 만 조회 가능)

요청 URL : http://www.aladin.co.kr/ttb/api/ItemList.aspx

요청 URL샘플 :

1
http://www.aladin.co.kr/ttb/api/ItemList.aspx?ttbkey=TTBKey&QueryType=ItemNewAll&MaxResults=10&start=1&SearchTarget=Book&output=xml&Version=20131101

상품 json 형식

item array 밑에 결과 데이터가 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
{
"version": "20131101",
"logo": "http://image.aladin.co.kr/img/header/2011/aladin_logo_new.gif",
"title": "알라딘 베스트셀러 리스트 - 소설/시/희곡",
"link": "http://www.aladin.co.kr/shop/common/wbest.aspx?BestType=Bestseller&amp;BranchType=1&amp;CID=1&amp;Year=2013&amp;Month=11&amp;Week=1&amp;partner=openAPI",
"pubDate": "Tue, 05 Nov 2013 07:48:18 GMT",
"totalResults": 200,
"startIndex": 1,
"itemsPerPage": 10,
"query": "QueryType=BESTSELLER;CategoryId=1;Year=2013;Month=11;Week=1",
"searchCategoryId": 1,
"searchCategoryName": "소설/시/희곡",
"item": [
{
"title": "제3인류 1",
"link": "http://www.aladin.co.kr/shop/wproduct.aspx?ISBN=8932916373&amp;partner=openAPI",
"author": "베르나르 베르베르 지음, 이세욱 옮김",
"pubDate": "2013-10-21",
"description": "베르나르 베르베르 특유의 상상력으로 축조한 장대한 스케일의 과학 소설. 남극. 저명한 고생물학자 샤를 웰즈의 탐사대가 17미터에 달하는 거인의 유골들을 발굴한다. 그러나 인류사를 다시 쓰게 만들 이 중대한 발견은 발굴 현장의 사고와 함께 곧바로 파묻히고 마는데…",
"isbn": "8932916373",
"isbn13": "9788932916378",
"itemId": 32136853,
"priceSales": 12420,
"priceStandard": 13800,
"mallType": "BOOK",
"stockStatus": "",
"mileage": 1250,
"cover": "http://image.aladin.co.kr/product/3213/68/coversum/8932916373_2.jpg",
"publisher": "열린책들",
"salesPoint": 72420,
"fixedPrice": true,
"customerReviewRank": 9,
"bestRank": 1,
"subInfo": {
"ebookList": [
{
"itemId": 32241318,
"isbn": "E893291637",
"priceSales": 8100,
"link": "http://www.aladin.co.kr/shop/wproduct.aspx?ISBN=E893291637&amp;partner=openAPI"
}
],
"usedList": {
"aladinUsed": {
"itemCount": 0,
"minPrice": 0,
"link": "http://www.aladin.co.kr/shop/UsedShop/wuseditemall.aspx?ISBN=8932916373&amp;TabType=2&amp;partner=openAPI"
},
"userUsed": {
"itemCount": 9,
"minPrice": 8900,
"link": "http://www.aladin.co.kr/shop/UsedShop/wuseditemall.aspx?ISBN=8932916373&amp;TabType=1&amp;partner=openAPI"
}
}
}
},
{
"title": "제3인류 2",
"link": "http://www.aladin.co.kr/shop/wproduct.aspx?ISBN=8932916381&amp;partner=openAPI",
"author": "베르나르 베르베르 지음, 이세욱 옮김",
"pubDate": "2013-10-21",
"description": "베르나르 베르베르 특유의 상상력으로 축조한 장대한 스케일의 과학 소설. 남극. 저명한 고생물학자 샤를 웰즈의 탐사대가 17미터에 달하는 거인의 유골들을 발굴한다. 그러나 인류사를 다시 쓰게 만들 이 중대한 발견은 발굴 현장의 사고와 함께 곧바로 파묻히고 마는데…",
"isbn": "8932916381",
"isbn13": "9788932916385",
"itemId": 32136901,
"priceSales": 12420,
"priceStandard": 13800,
"mallType": "BOOK",
"stockStatus": "",
"mileage": 1250,
"cover": "http://image.aladin.co.kr/product/3213/69/coversum/8932916381_2.jpg",
"publisher": "열린책들",
"salesPoint": 50880,
"fixedPrice": true,
"customerReviewRank": 10,
"bestRank": 2,
"subInfo": {
"ebookList": [
{
"itemId": 32241317,
"isbn": "E893291638",
"priceSales": 8100,
"link": "http://www.aladin.co.kr/shop/wproduct.aspx?ISBN=E893291638&amp;partner=openAPI"
}
],
"usedList": {
"aladinUsed": {
"itemCount": 0,
"minPrice": 0,
"link": "http://www.aladin.co.kr/shop/UsedShop/wuseditemall.aspx?ISBN=8932916381&amp;TabType=2&amp;partner=openAPI"
},
"userUsed": {
"itemCount": 3,
"minPrice": 10500,
"link": "http://www.aladin.co.kr/shop/UsedShop/wuseditemall.aspx?ISBN=8932916381&amp;TabType=1&amp;partner=openAPI"
}
}
}
}
]
}

Rasberry Pi Camera 개발환경 구성

piCamera 구성

현재 시스템 정보

1
2
$ uname -a
Linux camerapi 4.9.35-v7+ #1014 SMP Fri Jun 30 14:47:43 BST 2017 armv7l GNU/Linux

Science modules

1
2
3
sudo apt-get install build-essential python-dev python-distlib python3-dev python3-distlib
sudo apt-get install libzmq3-dev
sudo apt-get install libgdal-dev
1
2
3
4
5
$ sudo apt-get install python-numpy python-decorator python-scipy
$ sudo apt-get install python-matplotlib

$ sudo apt-get install python3-decorator python3-numpy python3-scipy
$ sudo apt-get install python3-matplotlib

Jupyter-notebook

1
2
3
4
5
6
$ mkvirtualenv -p python3 --system-site-packages cv3python3
$
(cv3python3) $ pip install jupyter


(cv3python3) $ jupyter-notebook --no-browser --ip=* --port=8585 jupyterCamera/

Camera

카메라 파이썬 모듈은 pip에서 설치하는 것으로 하자.

패키로 설치시

1
$ sudo apt-get install python-picamera python-numpy python-rpi.gpio python-opencv ffmpeg

cv3

Raspbian Wheezy : Python 설치

Raspbian과 Python

raspbian-wheezy에는 Python 2.7과 Python 3.2가 설치되어 있습니다.

Python tools

파이썬으로 개발하며 필요한 도구를 설치해서 사용하면 좋습니다. 파이썬 패키지 관리 도고, 가상 개발 환경 등의 설치를 통해서

APT로 설치

라즈비안에서 사용하는 파이썬 패키지들은 apt를 이용해서 라즈비안 저장소의 다양한 패키지를 사용할 수 있습니다. apt로 파이썬 패키지를 설치해 사용할 수 있는데 Python 2.x와 Python 3.x의 호환을 위해서 Python 2.x는 ‘python-‘ 접두어를 사용하고 Python 3.x 패키지들은 ‘python3-‘ 를 사용합니다.
예를 들어 picamera 패키지는 python-picamera와 Python 3.x 버전을 위해서 python3-picamera가 있습니다.

사전 준비

기본 개발자 모듈이 설치 안되어 있다면 설치한다.

1
$ sudo apt install build-essential

Python 개발을 위해서는 리눅스에 파이썬 헤더가 필요하다. 그래서 python-dev 패키지를 설치해 준다.
Jessie에서 Python3.4 헤더는 설치가 되어 있다.

1
2
$ sudo apt-get install python3-dev
python3-dev is already the newest version.

python2 개발환경을 위해서 헤더를 설치하려면

1
2
3
4
$ sudo apt install python-dev

The following extra packages will be installed:
libexpat1-dev libssl-dev libssl-doc python2.7-dev

pip

전통적인 파이썬 패키지 도구인 PIP(Python Package Index, PyPI)를 이용하면 폭넓게 범위를 넓힐 수 있습니다.

Raspbian Jessie : 기본으로 제공
apt를 이용해 저장소에 있는 외부 패키지를 설치해 사용할 수 있습니다. 그렇지만 개발에 필요한 모든 패키지가 라즈비안 저장소에 있지 않거나 오래된 버전일 수 있습니다.

Python2.x용 pip는 python-pip를 설치하고 Python3.x pip는 python-pip3 를 설치합니다.

1
2
$ sudo apt-get install -y python-pip
$ sudo apt-get install -y python3-pip

Pip 소스로 설치

혹은 pip를 최신 소스로 부터 직접 설치하려면 다음같이 실행합니다.

1
$ wget https://bootstrap.pypa.io/get-pip.py

시스템에 설치된 python 버전 마다 sudo로 pip를 설치애야 합니다. Python3 을 위한 pip를 설치한다.

1
2
$ sudo python3 get-pip.py
Successfully installed pip-8.1.2 setuptools-24.0.3 wheel-0.29.0

다음은 Python2를 위한 pip를 설치합니다.

1
$ sudo python2.7 get-pip.py

Raspbian에서 사용자 계정에서 pip 설치하면 퍼미션 에러가 발생한다.
OSError: [Errno 13] Permission denied: ‘/usr/local/lib/python2.7/dist-packages/pip-7.1.2.dist-info’
sudo 명령으로 설치해야 한다.

pip 설치 참조

https://pip.pypa.io/en/latest/installing.html
http://stackoverflow.com/questions/6587507/how-to-install-pip-with-python-3

슈퍼사용자로 pip 설치시 사용자 계정에서 사용하기 불편한 점이 많다. 그래서 가상 개발환경을 구성해 사용자 계정에서 제약없이 사용하도록 한다.

pip 사용

pyhthon2, python3 버전이 설치되어서 pip도 역시 해당 버전이 별도로 설치되어 있습니다. 다음 버전 저보를 출력하면 어떤 버전인지 확인이 가능합니다.

1
2
3
4
$ pip3 --version
pip 8.1.2 from /usr/local/lib/python3.5/dist-packages (python 3.5)
$ pip2 --version
pip 8.1.2 from /usr/local/lib/python2.7/dist-packages (python 2.7)

특정 파이썬 버전의 패키지 모듈을 설치한다면 해당 pip 버전을 호촐하는게 정확합니다.

upgrade pip

pip 는 다음 같이 업그레이드 해야 합니다.

1
$pip install -U pip

On Windows [5]:

1
$python -m pip install -U pip

Python 버전 관리자

다양한 파이썬 버전을 위해 환경 구성을 해주는 유틸리티.

  • pyenv : “Simple Python Version Management”, 로컬에 다양한 파이썬 버전을 설치하고 사용할 수 있도록 한다. pyenv를 사용함으로써 파이썬 버전에 대한 의존성을 해결할 수 있다.

  • virtualenv : “Virtual Python Environment builder”, 로컬에 다양한 파이썬 환경을 구축하고 사용할 수 있도록 한다. 일반적으로 Python Packages라고 부르는 ( pip install을 통해서 설치하는 ) 패키지들에 대한 의존성을 해결할 수 있다.

virtualenv와 virtualenvwrapper를 사용할 것이다.

  • autoenv : 만약 pyenv와 virtualenv를 통해서 의존성을 해결한다고 하더라도 작업할때마다 설정해주는 것은 귀찮은 작업이다. 특정 프로젝트 폴더로 들어가면 자동으로 개발 환경을 설정해주는 autoenv라는 스크립트를 활용하자.

여기서는 virtualenv를 설치하고 virtualenvwrapper를 사용해서 모듈을 설치하고 관리한다. 그러기 위해서 먼저 시스템의 기본 /usr/bin/python 버전을 확인하고 해당 버전의 pip 모듈을 사용해서 virtualenv 와 virtualenvwrapper 를 설치한다.

virtualenv

virtualenv는 가상의 파이썬 작업환경을 만들어 준다. 작업환경을 따로따로 만들어주면 해당 환경 내의 파이썬으로 무슨 짓을 해도 시스템 파이썬이나 다른 가상의 작업환경에게 영향을 주지 않는다.
pip로 설치할 수 있습니다.

pip는 시스템의 site-packages 폴더에, /usr/lib/python2.7/site-packages에 모듈을 설치한다. virtualenv를 이용하면 분리할 수 있다.

단, 현재 python2.7과 python3.4가 공존하는 상태에서 virtualenv는 python2.x를 기반으로 만들어 져서 /usr/bin/python을 찾는데 그래서 다음 같이 pip2 버전으로 virtualenv를 설치해 준다.

1
$ pip install virtualenv

virtualenv는 python 버전에 관계 없이 하나만을 설치해 두면 된다.

virtualenvwrapper

virtualenvwrapper는 virtualenv 통합 환경을 좀 더 쉽게 접근할 수 있도록 도와줍니다. ‘virtualenv’ 가 설치된 글로벌 사이트 패키지 위치에 설치되야 합니다. 아마 관리자 권한이 필요할 것입니다.

라즈비안에서는 sudo로 설치해 주어야 한다. 다름 같이 pip로 설치합니다.

1
$ sudo pip install virtualenvwrapper

이제 일반 사용자 환경에서 python 개발환경을 구축해 보자.

셀 환경 구성하기

쉘 (.bashrc, .profile, 등)에 다음 라인을 추가합니다.

1
2
3
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Devel
source /usr/local/bin/virtualenvwrapper.sh

그리고 쉘 환경을 로딩하기 위해서 다시 로그인 하거나 다음 같이 source 명령을 이용해도 좋습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ source .profile
ebian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Oct 23 18:17:41 2015 from 192.168.219.103
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/premkproject
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/postmkproject
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/initialize
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/premkvirtualenv
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/postmkvirtualenv
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/prermvirtualenv
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/postrmvirtualenv
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/predeactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/postdeactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/preactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/postactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/get_env_details

다음 에러가 발생하면 쉘에 VIRTUALENVWRAPPER_PYTHON 를 추가해 준다.

/usr/bin/python: No module named virtualenvwrapper
virtualenvwrapper.sh: There was a problem running the initialization hooks.

If Python could not import the module virtualenvwrapper.hook_loader,
check that virtualenvwrapper has been installed for
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python and that PATH is

Quick-Start

다음 같이 virtualenvwrapper 를 사용할 수 있습니다.

  1. workon 명령으로 실행 가상 환경 목록 혹은 변경한다.
1
$workon
  1. 실행 가상 환경 ‘raspberrypi2’ 생성
1
2
3
4
5
6
7
8
9
10
11
$ mkvirtualenv -p python2 raspberrypi2
New python executable in raspberrypi2/bin/python2.7
Also creating executable in raspberrypi2/bin/python
Installing setuptools, pip, wheel...done.
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/raspberrypi2/bin/predeactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/raspberrypi2/bin/postdeactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/raspberrypi2/bin/preactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/raspberrypi2/bin/postactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/raspberrypi2/bin/get_env_details

(raspberrypi2)pi@raspberrypi ~ $ # 실행 가상 환경 쉘
  1. 프로젝트 환경을 빠져 나오려면 ‘deactivate’를 실행한다.
1
(raspberrypi2):~$ deactivate
rpi.gpio
1
(raspberrypi2)$pip install rpi.gpio

이제 이 디렉토리 밑에서 코드 작업을 하고 사용하면 됩니다.

다른 Python 버전 환경 만들기

1
2
3
4
5
6
$ mkvirtualenv -p python3 rpi_py3
Running virtualenv with interpreter /usr/bin/python3
New python executable in rpi_py3/bin/python3
Also creating executable in rpi_py3/bin/python
Installing setuptools, pip...done.
...

virtualenv 사용

위의 설명과 같이 고립된 작업환경을 만들려면 디렉토리 구조를 잘 구성해야 합니다. 다음 같이 라즈베리파이 프로그램을 작업할 ‘Blinke’ 디렉토리를 만듭니다. Blinken은 LED를 깜박이는 작업을 수행할 것입니다.

1
2
3
4
5
6
7
$mkdir blinken
$cd blinken
$virtualenv env
New python executable in env/bin/python
Installing setuptools, pip...done.
$. env/bin/activate
(env)$

마지막 명령으로 가상환경을 활성화시키면 프롬프트 앞에 (env)가 표시됩니다. 가상환경을 바탕으로 환경 설정이 동작한다는 것을 의미합니다. 이제 필요한 파이썬 패키지 및 프로그램을 설치하고 개발을 할 수 있습니다.

독립된 DJango 환경 이용하기
1
2
3
4
5
$ mkdir django_tests
$ cd django_tests
$ virtualenv --no-site-packages env
$ source env/bin/activate
(env)$

다시 시스템 파이썬으로 복귀하고 싶으면 deactivate를 실행합니다.

1
(env)$ deactivate

다른 버전의 Python 환경 만들기

1
$ sudo python3 get-pip.py

python3의 virtualenvwrapper를 설치한다.

1
2
3
$ sudo pip3 install virtualenvwrapper
Collecting virtualenvwrapper
Using cached virtualenvwrapper-4.7.1-py2.py3-none-any.whl

mkvirtualenv에서 python3의 환경을 하나 설치한.다.

1
2
3
4
5
6
$ mkvirtualenv -p python3 rpi_py3
Running virtualenv with interpreter /usr/bin/python3
New python executable in rpi_py3/bin/python3
Also creating executable in rpi_py3/bin/python
Installing setuptools, pip...done.
...

가상환경 복사하기

cpvirtualenv oldenv newenv
rmvirtualenv oldenv

pyvenv

3.3에서부터 pyvenv에 기본으로 설치되어 있다. 다만 3.3에서는 pip를 가상 환경을 만들 때마다 설치해주어야 한다. 3.4에서는 pip까지 기본으로 설치되어 있다.

1
2
3
4
5
$ mkdir django_tests
$ cd django_tests
$ pyvenv-3.4 env
$ source env/bin/activate # env의 파이썬 활성화
(env)$ deactivate # 시스템 파이썬으로 복귀

라즈비안 시스템과 파이썬

파이썬을 이용하면 시스템 관련 정보를 활용할 수 있습니다.

라즈페리파이 모델 확인하기

cpuinfo를 살펴보면 현재 라즈베리파이 모델을 확인할 수 있습니다.

1
2
3
4
$cat /proc/cpuinfo
...
Hardware : BCM2708
Revision : 0003

출력 결과에서 Revision을 살펴보면 라즈페리파이 모델을 확인할 수 있습니다. 이 리비전 번호를 다음 링크의 테이블에서 찾아 보면 확인이 가능합니다.

Python으로 오에스 확인하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ python
Python 2.7.3 (default, Mar 18 2014, 05:13:23)
>>> import os
>>> print os.name
posix
>>> import sys
>>> sys.platform
linux2
>>> import platform
>>> platform.system()
'Linux'
>>> platform.release()
'3.18.7+'
>>> platform.machine()
'armv6l'

참조

치할 수 있다. installing-from-wheels 참조.

다음은 우리 프로젝트의 wheel 패키징을 설치한다.

1
python -m pip install example_package_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl

혹은 provides_extras 메타 정보를 사용해 추가 설치를 한다면,

1
python -m pip install './somepackage-1.0-py2.py3-none-any.whl[my-extras]'

Upload

처음 PyPi 에 업로드를 하려면 아래 2가지 단계를 거쳐서 진행해 본다.

  1. https://test.pypi.org/account/register/ 에서 등록
    1. 실제 pypi 가 아닌 튜토리얼과 테스트를 위한 곳.
  2. PyPi 업로드를 완성하려면 PyPI API token 을 발급받아야 한다.
    1. https://test.pypi.org/manage/account/#api-tokens

PyPI에 업로드가 완료되면 pip 를 통해서 패키지를 설치할 수 있다. 업로드를 위해서 Twin 패키지를 설치하고 사용해야 한다.

1
python3 -m pip install --upgrade twine

twine 모듈을 사용해서 dist/ 아래의 모든 소스/휠 패키징 묶음을 업로드할 수 있다. 지금은 testpypi 에 업로드를 해보자.

1
python3 -m twine upload --repository testpypi dist/*

업로드 진행은 아래 같을 것이다.

1
2
3
4
5
6
7
Uploading distributions to https://test.pypi.org/legacy/
Enter your username: __token__
Uploading example_package_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.2/8.2 kB • 00:01 • ?
Uploading example_package_YOUR_USERNAME_HERE-0.0.1.tar.gz
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.8/6.8 kB • 00:00 • ?

여기서 repository로 testpypi 를 지정했으므로 업로드한 결과는 다음 같이 확인할 수 있다.

저장소에서 설치하기

위에 testpypi 에 업로드한 패키지를 설치하려면 아래 같이 --index-url 로 저장소를 지정해서 사용한다.

1
python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps example-package-YOUR-USERNAME-HERE

PyPI 에 업로드

마지막으로 실제 패키지를 PyPI에 업로드하려면 https://pypi.org 등록을 하고, 등록한 사용자 아이디를 사용하고 --repository 인자를 제외하고 업로드하면 된다.

1
python3 -m twine upload dist/*

통합 메타 정보로서 pyproject.toml 활용

테스트, 코드 포맷팅 등에 대한 정보로 활용한다. 대표적으로는 코드 포맷팅 도구인 black, 테스트용 프레임워크인 pytest 등이 pyproject.toml에 설정 값을 저장하고 있다 - 파이썬 패키징의 역사, blog

1
2
3
4
5
# pyproject.toml of black
[tool.black]
line-length = 88
target-version = ['py36', 'py37', 'py38']
include = '\.pyi?$'

다음

이후에 다른 빌드 도구들, 테스트 도구들을 다뤄보자.

참고

  1. 파이썬 모듈 배포하기, python.org
  2. Tool recommendations, python.org
    1. 주요 패키징에 필요한 도구 안내
  3. 파이썬 패키징의 역사, blog
  4. TOML의 이해와 기본 활용, itworld
  5. Python package의 build frontend 와 backend

Python 에서 secret 키 값 이용하기 - json

크롤링, 데이터 베이스 연결등에 사용자 인증번호를 사용하는데 코드 자체에 아이디/비밀번호를 입력해서 사용하면 유출의 염려가 있으므로 이를 외부 파일에 두고 관리하고자 한다.

여러가지 방법이 있겠지만 여기서는 json 을 사용한다.

key:value 형식의 properties, 윈도우 ini 같은 형식을 지원하는 configparser 모듈도 좋은 선택 같다.

json 이용 키 관리

외부에 아래 형식의 secret 파일을 생성한다.

  • 디렉토리: .api_keys/ 폴더 사용
  • 파일: secret_keys.json

secret_keys.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{   "naver.com" : {
"userid": "UR_ID",
"password" :"votmdnjem" },
"apple.net": {
"userid": "UR_ID",
"password" : "votmdnjem" },
"api.twitter.com": {
"CONSUMER_KEY" : "unJgTOc0aZkk7NoX4LlD5g",
"CONSUMER_SECRET":"uHdmctDcPM66s9OasrKnr2x3pu88",
"ACCESS_TOKEN" : "98948674-J9auHiBiOGoWUJOzRafp",
"ACCESS_TOKEN_SECRET" : "kKgT9tlSY2rCIAbWJrCEEiTsR37" },
"my_database" : {
"userid" : "UR_ID",
"password" : "votmdnjem"}
}

파일 사용

json 모듈을 사용해서 해당 파일을 읽으면 키:값 형식으로 참조해서 사용할 수 있다.

1
2
3
4
import json

with open('../../.api_keys/secret_keys.json') as f:
secrets = json.loads(f.read())

이렇게 읽어들인 json 은 dict 같이 사용할 수 있다.

1
DB_USER, DB_PW = secrets['my_database']['userid'], secrets['my_database']['password']

pip/conda Proxy 사용하기

회사 등에서 방화벽을 사용하는 경우 pip / conda 저장소에서 패키지 설치가 안되는 경우가 있다. 또한 방화벽 안에서 설치할 경우 SSL verification error 에러 발생으로 설치가 안되기도 한다. 이런 경우 직접 pip 혹은 conda 설치가 안되는 경우에 프락시 지정을 해서 사용이 가능하다.

conda proxy

.condarc 파일과 conda 명령 옵션으로 사용할 수 있다.

.condarc 파일

사용자 홈디렉토리 .condarc 파일에 proxy 구성을 한다.

파일에 proxy_servers 구성해 사용한다.

1
2
3
proxy_servers:
http: http://IP_ADDRESS:8080
https: https://IP_ADDRESS:8080

ssl_verify: SSL verification error

방화벽 때문에 파이썬 패키지를 설치할 때 SSL 인증 오류(SSL verification error)가 생겨 곤란할 때가 있다. 만약 프락시 인증서가 필요하면 pip 인증서를 추가하면 ssl verification 에러를 피할 수 있다.

1
2
3
4
proxy_servers:
http: http://IP_ADDRESS:8080
https: https://IP_ADDRESS:8080
ssl_verify: %programdata%\pip\dscert.crt

conda --set 옵션 사용

설정 파일 대신 conda 명령에서 --set 옵션을 사용하면 설정 파일을 편집해서 저장이 된다.

1
conda config --set [설정내용]

다음은 ssl_verify 에 pip 인증서를 추가하거나 False 로 제외하고 사용하고 있다.

1
conda config --set ssl_verify False

명령에서 즉시 사용할 때는 --add 옵션을 사용한다.


pip proxy

pip 명령은 명려에서 옵션 pip proxy 옵션을 사용하거나 설정 파일 pip.ini 로 구성할 수 있다.

pip.ini

pip는 사용자 구성에서 아래 같이

  • 윈도우: %HOMEPATH%\pip\pip.ini
  • 리눅스/맥: $HOME/.pip/pip.conf

trusted-host 를 구성해 준다.

1
2
3
4
5
6
[global]
proxy=http://IP_ADDRESS:8080
trusted-host = pypi.python.org
pypi.org
files.pythonhosted.org

ssl cert

SSL 의 경우 cert 옵션을 사용할 수 있다.

1
2
3
4
5
6
[global]
cert=C:\Users\user\pip\cert.crt
proxy=http://IP_ADDRESS:8080
trusted-host = pypi.python.org
pypi.org
files.pythonhosted.org

pip 명령 사용

명령으로 직접 proxy 를 지정할 수 있다.

1
pip install --proxy https://{proxy}:{port} {BINARY}

다음 같인 trusted-host 등도 지정 할 수 있다.

1
pip install --upgrade --proxy https://IP_ADDRESS:8080 --trusted-host pypi.python.org --trusted-host pypi.org --trusted-host files.pythonhosted.org matplotlib numpy openpyxl xlrd xlwt pandas

Python : pyenv-windows 와 Jupyterlab 환경

pyenv-windows 와 Jupyterlab 환경

pyenv-windows 설치

파워셀에서 설치 스크립트를 실행해서 설치하는 과정으로 정리되어 있다.

준비

  1. 테스트
    • Windows 10 Home 21H1 / 19043.928
    • Microsoft Visual C++ 2015-2019 Redistribution
    • pip version 22.1 혹은 22.0 상태
  2. 주의
    Windows 최신 (Windows 11 등)

    pip 22.3 이상인 경우 Microsoft Visual C++ Build Tools 를 설치해야 한다.

    이어지는 Microsoft C++ Build Tools 설치 참조해 설치한다.

PowerShell 스크립트 실행 모드 확인

외부 스크립을 실행할 수 있기 위해서는 ExecutionPolicy가 unrestricted 상태여야 한다.

PowerShell을 관리자 모드로 실행해

다음과 같이 입력

1
2
> ExecutionPolicy      <-- 현재 상태 확인
Restricted <-- 모든 스크립트 막은 상태

모드 변경을 위해 다음 명령 실행

1
> Set-ExecutionPolicy Unrestricted

모드 변경 확인

1
2
> ExecutionPolicy      <-- 현재 상태 확인
Unrestricted <-- 모든 스크립트 허용 상태.

모드가 Unrestricted 상태에서 pyenv-win 을 설치한다.


pyenv-win 설치

pyenv-win 설치 항목에서 파워쉘을 통해 스크립트 실행을 통해 설치한다. 모든 방법들은 윈도우 홈 디렉토리의 .pyenv/ 폴더 아래에 실행 스크립을 위치한다.

인스톨러

다음 파워쉘 스크립트를 파워쉘에서 실행한다.

1
2
Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"

만약 Unauthorized Script 에러가 나면 PowerShell 스크립트 실행 모드 확인 같이 Unrestricted 모드로 설정해야 한다.

실행하면 %USERPROFILE%/.pyenv 아래에 관련 파일을 다운로드 한다.

설치 완료후 파워쉘에서 pyenv 명령을 실행하면 아래 같이 도움말 화면이 나오면 성공이다.

Microsoft C++ Build Tools 설치

pip versions 22.3 이상 업그레이드 혹은 설치를 하면 Redistribution 패키지 설치로는 해결이 안된다.

  • pip v22.1 까지는 Microsoft Visual C++ 2015-2019 Redistribution 로도 충분하다.

다음 사이트에서 build tools 을 다운로드 받아 설치한다.

설치시 아래 옵션을 선택해 설치한다.

Python 배포본 설치

이제 pyenv 를 사용해서 Python 3.10, Python 3.9 버전을 설치해 보자.

설치 가능한 버전은 pyenv install -l 명령으로 확인 가능하다. 아래 같이 파워셀에서 필요한 버전을 필터링해 확인해 보자.

1
2
3
4
5
6
7
8
PS > pyenv install -l | findstr 3.9
.
.
3.9.11
3.9.12-win32
3.9.12
3.9.13-win32
3.9.13

원하는 버전의 버전 번호를 입력해 설치한다.

윈도우 버전의 배포본이 pyenv 의 가상환경 폴더 밑에 설치 된다.

이어서 바로 Python 3.9 버전도 설치해 보자.

윈도우 버전 배포본 설치가 진행된다.

pyenv 에서 설치한 Python 3.10, Python 3.9 를 설치 확인을 해보자

Jupyter-Lab 설치

3.9 버전을 글로벌로 지정했다.

1
PS C:\Users\andro> pyenv global 3.9.12

pyenv 가능한 버전 확인

1
2
3
PS C:\Users\andro> pyenv versions
3.10.4
*3.9.12

현재 파워쉘의 파이썬 버전을 3.10 으로 지정했다.

1
2
3
PS C:\Users\andro> pyenv shell 3.10.4
PS C:\Users\andro> python -V
Python 3.10.4

venv 모듈로 가상환경을 생성하고 활성화 한다.

1
2
3
PS C:\Users\andro> python -m venv .venv/jupyter_p310
PS C:\Users\andro>.\.venv\jupyter_p310\Scripts\activate
(jupyter_p310) PS C:\Users\andro>

jupyter-lab 설치

1
2
(jupyter_p310) PS C:\Users\andro> pip install jupyterlab
Collecting jupyterlab

Jupyter-lab에서 사용할 notebook 공간 생성

1
(jupyter_p310) PS C:\Users\andro> mkdir jupyter-work

jupyter-lab 실행

1
2
3
4
5
6
7
8
9
10
11
(jupyter_p310) PS C:\Users\andro> jupyter-lab --no-browser .\jupyter-work\
...
[I 2022-05-24 03:27:03.847 ServerApp] Serving notebooks from local directory: C:\Users\andro\jupyter-work
[I 2022-05-24 03:27:03.847 ServerApp] Jupyter Server 1.17.0 is running at:
...
To access the server, open this file in a browser:
file:///C:/Users/andro/AppData/Roaming/jupyter/runtime/jpserver-4664-open.html
Or copy and paste one of these URLs:
http://localhost:8888/lab?token=866bdd9bed841f4dafc5c431a7ffcd4b01f516e4583f38d7
or http://127.0.0.1:8888/lab?token=866bdd9bed841f4dafc5c431a7ffcd4b01f516e4583f38d7
[W 2022-05-24 03:28:04.189 LabApp] Could not determine jupyterlab build status without nodejs