출처:
https://en.wikipedia.org/wiki/Shim_(computing)
https://github.com/pyenv/pyenv
https://github.com/pyenv/pyenv/blob/master/COMMANDS.md
pyenv
· 파이썬의 가상환경 중 하나다.
- 여러가지 파이썬 가상 환경: https://github.com/pyenv/pyenv
· pyenv를 사용하면 여러 버전의 파이썬을 쉽게 전환할 수 있다.
· 해당 프로젝트는 rbenv와 ruby-build에서 포크되었고, 파이썬 용도로 수정되었다.
· pyenv의 기능:
1. 사용자별로 전역 파이썬 버전을 변경할 수 있다.
2. 프로젝트별 파이썬 버전에 대한 지원을 제공한다.
3. 환경 변수로 파이썬 버전을 재정의할 수 있다.
4. 한 번에 여러 버전의 파이썬에서 명령어들을 검색할 수 있다.
- 이는 tox를 사용하여 파이썬 버전을 테스트하는 데 도움이 된다.
작동 방식
· pyenv는 PATH에 삽입되 shim 실행 파일을 사용하여 파이썬 명령을 가로채고, 애플리케이션에서 지정한 파이썬 버전을 확인하여 올바르게 파이썬을 설치하고 명령을 전달한다.
PATH
· python 또는 pip 같은 명령을 실행하면 운영 체제가 디렉터리 목록을 검색하여 해당 이름의 실행 파일을 찾는다. 디렉터리 목록은 PATH라는 환경 변수에 있고, 목록의 각 디렉터리는 콜론(:)으로 구분된다.
/usr/local/bin:/usr/bin:/bin
· PATH의 디렉터리는 왼쪽에서 오른쪽으로 검색된다. 따라서 목록의 시작 부분에 있는 디렉터리에서 일치하는 실행 파일이 끝에 있는 다른 디렉터리보다 우선한다.
- 예를 들어 위 경로는 /usr/local/bin가 첫 번째로 검색되고 다음으로 /usr/bin, /bin 순으로 검색된다.
Shims
· pyenv는 PATH 앞에 shim 디렉터리를 삽입하여 작동한다.
$(pyenv root)/shims:/usr/local/bin:/usr/bin:/bin
· rehashing이라는 프로세스를 통해 pyenv는 설치된 모든 파이썬 버전에서 모든 파이썬 명령(python, pip 등)과 일치하도록 해당 디렉터리에 shim을 유지 관리한다.
· Shims은 단순히 명령을 pyenv에 전달하는 경량 실행 파일이다. 따라서 pyenv이 설치된 상태에서 pip을 실행하면, 운영 체제는 다음을 수행한다.
1. PATH에서 pip 실행파일을 검색한다.
2. PATH 시작 부분에서 pip이라는 이름의 pyenv shim을 찾는다.
3. pip이라는 이름의 shim을 실행하면, pyenv에 명령이 전달된다.
파이썬 버전 선택하기
· shim을 실행할 때 pyenv는 다음 순서대로 사용할 Python 버전을 결정한다.
1. PYENV_VERSION 환경 변수(지정된 경우)
- pyenv셸 명령을 사용하여 현재 셸 세션에서 이 환경 변수를 설정할 수 있다.
2. 현재 디렉터리의 애플리케이션별 .python-version 파일(존재하는 경우)
- pyenv local 명령을 사용하여 현재 디렉터리의 .python-version 파일을 수정할 수 있다.
3. 파일 시스템의 루트에 도달할 때까지 각 상위 디렉토리를 검색하여 찾은 첫 번째 .python-version 파일 (존재하는 경우)
4. 전역 $(pyenv root)/version 파일
- pyenv global 명령을 사용하여 이 파일을 수정할 수 있다.
- 전역 버전 파일이 없다면, pyenv는 시스템 파이썬을 사용하려 한다고 가정한다.
파이썬 설치 위치 찾기
· pyenv가 애플리케이션에서 지정한 파이썬 버전을 확인하면, 해당 파이썬 설치에 명령을 전달한다.
· 각 파이썬 버전은 $(pyenv root)/versions 아래의 자체 디렉토리에 설치된다. 예를 들어 아래와 같다.
- $(pyenv root)/versions/2.7.8/
- $(pyenv root)/versions/3.4.2/
- $(pyenv root)/versions/2.4.0/
가상 환경 관리하기
· pyenv-vitualenv라는 pyenv 플러그인은 pyenv 사용자가 virtualenv 또는 Anaconda에서 만든 가상환경을 관리하는 데 도움이 되는 다양한 기능을 제공한다.
· 이러한 가상 환경의 활성화(active) 스트립트는 사용자 대화형 쉘의 $PATH 변수를 변경하는 것에 의존하기 때문에 pyenv의 shim 스타일 명령 실행 hook을 가로챈다. 이러한 가상 환경을 사용할 계획이 있다면, pyenv-virtualenv를 설치하는걸 추천한다.
pyenv 설치하기
macOS에 설치
1. HomeBrew를 통해 설치한다.
brew update
brew install pyenv
- 업그레이드: brew upgrade pyenv
- 삭제: brew uninstall pyenv
2. Pyenv가 제공하는 파이썬에 실수로 링크하는 것을 방지하려면 대화형 쉘 구성에 다음 줄을 추가한다.
- Bash/Zsh:
alias brew='env PATH="${PATH//$(pyenv root)\/shims:/}" brew'
- Fish:
alias brew="env PATH=(string replace (pyenv root)/shims '' \"\$PATH\") brew"
환경 변수
이름 | 기본값 | 설명 |
PYENV_VERSION | 사용할 파이썬 버전을 지정한다. | |
PYENV_ROOT | ~/.pyenv | 파이썬 버전 및 shim이 있는 디렉터리를 정의한다. |
PYENV_DEBUG | 디버그 정보를 출력한다. | |
PYENV_HOOK_PATH | pyenv hook를 검색한 경로의 콜론으로 구분한 목록이다. | |
PYENV_DIR | $PWD | .python-version 파일 검색을 시작할 디렉터리 |
PYTHON_BUILD_ARIA2_OPTS | - 추가 매개변수를 aria2에 전달하는 데 사용된다. aria2c 바이너리를 PATH에서 사용할 수 있는 경우 pyenv는 curl 또는 wget 대신 aria2c를 사용하여 파이썬 소스 코드를 다운로드한다. - 인터넷 연결이 불안정한 경우 이 변수를 사용하여 다운로드를 가속화하도록 aria2에 지시할 수 있다. |
명령어
pyenv help
· 사용 가능한 모든 pyenv 명령어를 수행하는 작업에 대한 설명과 함께 나열한다.
· 특정 명령에 대한 정보 보기: pyenv help <command>
pyenv commands
· 사용 가능한 모든 pyenv command를 나열한다.
pyenv local
· 현재 디렉토리의 .python-version 파일에 버전 이름을 작성하여 로컬 애플리케이션별 파이썬 버전(local application-specific Python)을 설정한다.
- 해당 버전은 전역 버전을 재정의하며, PYENV_VERSION 환경 변수를 설정하거나 pyenv 셸 명령을 사용하여 자체적으로 재정의할 수 있다.
$ pyenv local 2.7.6
- 버전 번호 없이 실행하면, 현재 구성된 로컬 버전을 보고한다. 로컬 버전을 설정 해제할 수도 있다.
$ pyenv local --unset
· 이전 버전의 pyenv는 .pyenv-version 파일에 로컬 버전 사양을 저장했다. 이전 버전과 호환성을 위해 .pyenv-version 파일에 지정된 로컬 버전을 일지만, 동일한 디렉터리에 있는 .python-version 파일을 우선한다.
· 한 번에 여러 버전을 로컬 파이썬으로 지정할 수 있다.
- 예시1
$ pyenv local 2.7.6 3.3.3
$ pyenv versions
system
* 2.7.6 (set by /Users/yyuu/path/to/project/.python-version)
* 3.3.3 (set by /Users/yyuu/path/to/project/.python-version)
$ python --version
Python 2.7.6
$ python2.7 --version
Python 2.7.6
$ python3.3 --version
Python 3.3.3
-예시2
$ pyenv local 3.3.3 2.7.6
$ pyenv versions
system
* 2.7.6 (set by /Users/yyuu/path/to/project/.python-version)
* 3.3.3 (set by /Users/yyuu/path/to/project/.python-version)
venv27
$ python --version
Python 3.3.3
$ python2.7 --version
Python 2.7.6
$ python3.3 --version
Python 3.3.3
pyenv global
· 버전 이름을 ~/.pyenv/version 파일에 작성하여 모든 셸에서 사용할 Python의 전역 버전을 설정할 수 있다. 이 버전은 응용 프로그램별 .python-versions 파일이나 PYENV_VERSION 환경 변수를 설정하여 재정의 할 수 있다.
$ pyenv global 2.7.6
· 버전 번호 없이 실행하면 현재 구성된 글로벌 버전을 알려준다.
· 한 번에 여러 버전을 전역 파이썬으로 지정할 수 있다.
- 예시1
$ pyenv global 2.7.6 3.3.3
$ pyenv versions
system
* 2.7.6 (set by /Users/yyuu/.pyenv/version)
* 3.3.3 (set by /Users/yyuu/.pyenv/version)
$ python --version
Python 2.7.6
$ python2.7 --version
Python 2.7.6
$ python3.3 --version
Python 3.3.3
- 예시2
$ pyenv global 3.3.3 2.7.6
$ pyenv versions
system
* 2.7.6 (set by /Users/yyuu/.pyenv/version)
* 3.3.3 (set by /Users/yyuu/.pyenv/version)
venv27
$ python --version
Python 3.3.3
$ python2.7 --version
Python 2.7.6
$ python3.3 --version
Python 3.3.3
pyenv shell
· 셸에서 PYENV_VERSION 환경 변수를 설정하여 셸별 파이썬 버전을 설정할 수 있다.
- 해당 버전은 로컬 애플리케이션별 파이썬 버전과 글로벌 버전을 재정의한다.
$ pyenv shell pypy-2.2.1
· 버전 번호 없이 실행하면, pyenv 셸은 PYENV_VERSION의 현재 값을 알려준다.
· 셸 버전을 설정 해제할 수도 있다.
$ pyenv shell --unset
· 이 명령을 사용하려면 pyenv의 셸 통합을 활성화해야한다. 쉘 통합을 사용하지 않으려면 PYENV_VERSION 변수를 직정 설정하면 된다.
$ export PYENV_VERSION=pypy-2.2.1
TODO: pyenv install , pyenv uninstall, pyenv rehash, pyenv version, pyenv versions ,pyenv which ,pyenv whence ,pyenv exec ,pyenv root ,pyenv prefix ,pyenv hooks ,pyenv shims ,pyenv init ,pyenv completions
'파이썬' 카테고리의 다른 글
[Python] Mock 객체란? Mock 객체를 이용한 제어된 테스트하기 (0) | 2022.04.21 |
---|---|
[Python] pytest를 통한 파이썬 테스트 (feat. fixture) (2) | 2022.04.20 |
[Python] 파이썬에서 파일 입출력을 하는 방법 (0) | 2022.04.12 |
[Python] 파이썬의 스레드 사용 (0) | 2022.04.10 |
[Python] 파이썬에서 예외를 다루는 방법 (0) | 2022.04.09 |
댓글