본문 바로가기

D.S/Python

220219일 - python 가상환경

728x90



보통 app을 가상환경(virtualenv)에서 돌리는 일이 많아서 env구조를 어느정도는 알아야겠구나 생각이 들어서 정리한다. 보통 가상환경은 virtualenv로 생성한다.
패키지 로딩은 파이썬이 하니 단순하게 생각하면 가상환경 세팅의 핵심?은 어떤 경로의 파이썬을 쓸지 정해주는 거라 보면 될거같다.
airflow에서도 bash_operator나 python_operator를 이용해 뭔가를 할 때 알아두면 유용하다.



(가상환경 폴더의 이름은 env)

→ env의 python이 실행되면: (env 안의 python을 사용하겠다)

→ site모듈이 sys.prefix, sys.exec_prefix를 설정하여 (pyenv.cfg 위치 사용)

→ site-packages 경로만들고 sys.path에 추가 (앞으로 여기서 모듈을 찾겠다)

sys.path에는 다음의 경로가 추가된다.

→ 시스템(보통/usr에 설치되어 있는) python 의 sys.base_prefix
→ 현재 env의 sys.prefix

python my_pyfile.py 같이 py 파일을 실행할 때 이 파일의 경로(이것 때문에 종종 py파일에 상대경로로 import하면 에러가 날 수 있음)

 

env에서 pip를 통해 새로운 모듈을 설치할 때는:

→ sys.path의 sys.base_prefix와 sys.,prefix를 비교해서 다르면 가상환경을 사용하고 있다 생각하고 가상환경 내의 site-packages에 모듈을 설치함

기타:

→ venv 모듈이 실행 파일에 대한 symbolic links, pyenv.cfg와 같은 기본 뼈대 만듬
→ activate 명령을 PATH 환경 변수를 비롯한 몇 가지를 변경
→ pyenv.cfg의 위치를 사용해서 venv 내의 site-packages 경로를 sys.path에 추가한다.

추가: sys.path에 모듈경로 추가하기

sys.path를 통해서 모듈을 불러오는데, 모듈을 불러오는 방법은

PATHONPATH 환경변수에 모듈경로를 추가하는 방법과

→ sys.path에 직접 append 하는 방법 두 가지가 있다.

export PYTHONPATH=/my/module/path
python main.py

 


 

 

 

tree ./env -L 3
./env
├── bin
│   ├── activate
│   ├── activate.csh
│   ├── activate.fish
│   ├── activate.ps1
│   ├── activate_this.py
│   ├── activate.xsh
│   ├── beempy
│   ├── cmark
│   ├── docx2txt
│   ├── easy_install
│   ├── easy_install3
│   ├── easy_install-3.8
│   ├── fixup_monitoring_v3_keywords.py
│   ├── futurize
│   ├── google-oauthlib-tool
│   ├── markdown_py
│   ├── normalizer
│   ├── pasteurize
│   ├── pip
│   ├── pip3
│   ├── pip-3.8
│   ├── pip3.8
│   ├── piston
│   ├── __pycache__
│   │   └── fixup_monitoring_v3_keywords.cpython-38.pyc
│   ├── pyrsa-decrypt
│   ├── pyrsa-encrypt
│   ├── pyrsa-keygen
│   ├── pyrsa-priv2pub
│   ├── pyrsa-sign
│   ├── pyrsa-verify
│   ├── python -> /usr/bin/python3
│   ├── python3 -> python
│   ├── python3.8 -> python
│   ├── steemengine
│   ├── steempy
│   ├── steemtail
│   ├── wheel
│   ├── wheel3
│   ├── wheel-3.8
│   └── wsdump
├── lib
│   └── python3.8
│       └── site-packages
└── pyvenv.cfg

 

  • lib/python*.*/site-packages : 앞으로 모듈들이 설치될 곳
  • pyenv.cfg : 파이썬이 일반적으로 사용하는 설정파일.
  • sys.prefix, sys.exec_prefix : pywnv.cfg 가 위치한 경로를 값으로 설정. 이 변수값으로 site-packages 위치를 만들어낸다.
    • (sys.prefix/sys.exec_prefix)/lib/pathon*.*/site-packages
  • sys.path : 모듈을 import할 때 모듈을 찾아야 할 경로들을 저장해둔 list

 

activate 스크립트 안에 path 설정:

 

VIRTUAL_ENV='/data/apbot/env'
export VIRTUAL_ENV

_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"

 

  • _OLD_VIRTUAL_PATH : 기존의 PATH내역 백업용. deactivate할 때 PATH 원상 복귀하는 데 사용
  • 하고 PATH “앞에다가” venv의 bin 디렉터리를 추가함. → 앞에다가 넣어야 시스템 python말고 현재 env/bin 의 명령이 먼저 실행이 되쥬.



 

 

반응형