Skip to content

Commit d0a4160

Browse files
committed
better way 83 정리
1 parent c9b43b0 commit d0a4160

File tree

2 files changed

+165
-0
lines changed

2 files changed

+165
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,5 @@
124124
### 10장 협업
125125

126126
[82. 커뮤니티에서 만든 모듈을 어디서 찾을 수 있는지 알아두라](./summary/BetterWay82.md)
127+
[83. 가상 환경을 사용해 의존 관계를 격리하고 반복 생성할 수 있게 하라](./summary/BetterWay83.md)
127128

summary/BetterWay83.md

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
# 83. 가상 환경을 사용해 의존 관계를 격리하고 반복 생성할 수 있게 하라
2+
3+
## 1. 패키지 의존성
4+
5+
- 파이선으로 개발 시 다양한 패키지에 의존하게 됨
6+
- 문제
7+
- pip 가 새로운 패키지를 기본적으로 모든 파이선 인터프리터가 볼 수 있는 전역 위치에 저장
8+
- 내 PC 에서 실행되는 모든 파이선 프로그램이 설치한 모듈에 영향을 받음
9+
- 패키지의 transitive 의존 관계에 의해 문제 발생 가능
10+
- 설치한 패키지가 다른 패키지에 의존하는 경우
11+
- sphinx 패키지 의존 관계
12+
13+
```bash
14+
$ python3 -m pip show Sphinx
15+
Name: Sphinx
16+
Version: 2.1.2
17+
Summary: Python documentation generator
18+
Location: /usr/local/lib/python3.8/site-packages
19+
Requires: alabaster, imagesize, requests, sphinxcontrib-applehelp, sphinxcontrib-qthelp, Jinja2, setuptools, sphinxcontrib-jsmath, sphinxcontrib-serializinghtml, Pygments, snowballstemmer, packaging, sphinxcontrib-devhelp, sphinxcontrib-htmlhelp, babel, docutils
20+
Required-by:
21+
```
22+
23+
- flask 패키지 의존 관계
24+
25+
```bash
26+
$ python3 -m pip show flask
27+
Name: Flask
28+
Version: 1.0.3
29+
Summary: A simple framework for building complex web applications.
30+
Location: /usr/local/lib/python3.8/site-packages
31+
Requires: itsdangerous, click, Jinja2, Werkzeug
32+
Required-by:
33+
```
34+
35+
- 시간이 지남에 따라 Sphinx, flask 패키지가 서로 달라지므로 의존 관계 충돌 발생 가능
36+
- 의존 관계 지옥 발생
37+
- 설치한 패키지 일부는 새로운 버전을 사용해야 하고 다른 일부를 예전 버전을 사용해야 한다면 시스템이 제대로 작동하지 못하게 됨
38+
- 새로운 버전의 라이브러리가 해당 라이브러리의 API 에 의존하는 코드의 동작을 변경시킬 수 있음
39+
40+
41+
## 2. `venv` 패키지
42+
43+
- 특정 버전의 파이선 환경을 독립적으로 구성 가능
44+
- 한 시스템 안에서 같은 패키지의 다양한 버전을 서로 충돌 없이 사용 가능
45+
- 여러 다른 프로젝트를 진행하면서 프로젝트마다 각각 다른 도구/패키지 활용 가능
46+
47+
- `venv` 를 사용해 myproject 새 가상 환경 생성
48+
- 각 가상 환경은 서로 다른 유일한 디렉터리 안에 존재해야 함
49+
- `venv` 를 통해 가상 환경을 생성하면 가상 환경을 관리하기 위해 필요한 파일과 디렉토리 트리 존재
50+
51+
```bash
52+
$ which python3
53+
/usr/local/bin/python3
54+
$ python3 --version
55+
Python 3.8.0
56+
57+
$ python3 -m venv myproject
58+
$ cd myproject
59+
$ ls
60+
61+
bin include lib pyvenv.cfg
62+
```
63+
64+
- 리눅스에서 가상 환경을 사용하려면 bin/activate 스크립트에 대해 source 명령 사용, 윈도우의 경우 배치파일 실행
65+
66+
```bash
67+
# in Linux
68+
$ source bin/activate
69+
(myproject)$
70+
71+
# in Windows(for CMD)
72+
C:\> myproject\Scripts\activate.bat
73+
(myproject) C:>
74+
75+
#in Windows(for PowerShell)
76+
PS C:\> myproject\Scripts\activate.ps1
77+
(myproject) PS C:>
78+
```
79+
80+
- 가상 환경을 활성화하면 python3, pip 경로가 가상 환경 디렉토리 경로로 변경됨
81+
82+
```bash
83+
(myproject)$ which python3
84+
/tmp/myproject/bin/python3
85+
(myproject)$ ls -l /tmp/myproject/bin/python3
86+
... -> /usr/local/bin/python3.8
87+
```
88+
89+
- 가상 환경 밖의 시스템에 전역으로 설치된 pytz 패키지를 사용하려 시도하면 오류 발생
90+
- 가상 환경 내 새로 설치
91+
92+
```bash
93+
(myproject)$ python3 -c 'import pytz'
94+
Traceback (most recent call last):
95+
File "<string>", line 1, in <module>
96+
ModuleNotFoundError: No module named 'pytz'
97+
```
98+
99+
```bash
100+
(myproject)$ python3 -m pip install pytz
101+
Collecting pytz
102+
Downloading ...
103+
Installing collected packages: pytz
104+
Successfully installed pytz-2019.1
105+
```
106+
107+
- 가상 환경에서 기본 시스템으로 돌아가고 싶은 경우 deactivate 명령 실행
108+
109+
```bash
110+
(myproject)$ which python3
111+
/tmp/myproject/bin/python3
112+
(myproject)$ deactivate
113+
$ which python3
114+
/usr/local/bin/python3
115+
```
116+
117+
## 3. 의존 관계 재생성하기
118+
119+
- `venv` 를 사용하면 명시적으로 의존하는 모든 의존 관계를 파일제 저장 가능
120+
121+
```bash
122+
(myproject)$ python3 -m pip freeze > requirements.txt
123+
(myproject)$ cat requirements.txt
124+
certifi==2019.3.9
125+
chardet==3.0.4
126+
idna==2.8
127+
numpy==1.16.2
128+
pytz==2018.9
129+
requests==2.21.0
130+
urllib3==1.24.1
131+
```
132+
133+
- `venv` 로 가상 환경 생성 , activate 로 가상 환경 활성화
134+
135+
```bash
136+
$ python3 -m venv otherproject
137+
$ cd otherproject
138+
$ source bin/activate
139+
(otherproject)$
140+
```
141+
142+
- `python3 -m pip freeze` 명령으로 만든 `requirements.txt` 에 대해 가상 환경 내에서 `pip install` 을 실행하면 가상 환경에서의 패키지 설치 가능
143+
144+
```bash
145+
(otherproject)$ python3 -m pip install -r /tmp/myproject/requirements.txt
146+
...
147+
(otherproject)$ python3 -m pip list
148+
Package Version
149+
---------- --------
150+
certifi 2019.3.9
151+
chardet 3.0.4
152+
idna 2.8
153+
numpy 1.16.2
154+
pip 10.0.1
155+
pytz 2018.9
156+
requests 2.21.0
157+
setuptools 39.0.1
158+
urllib3 1.24.1
159+
```
160+
161+
- `requirements.txt` 는 버전 관리 시스템을 사용해 다른 사람과 협업할 때 이상적
162+
- 가상 환경 디렉토리를 통째로 옮기는 경우 모든 요소가 깨져버림
163+
- python3 와 같은 명령줄 도구 경로가 하드코딩되어 있기 때문
164+
- 이 경우 새로운 디렉토리에 가상 환경 생성 후 `requirements.txt` 를 통해 패키지 다시 내려받으면 끝

0 commit comments

Comments
 (0)