Python 가상 환경 작업 원리 분석

Python의 가상 환경은 상대적으로 독립된 실행 환경을 만드는 데 사용된다. 특히 일부 의존적인 삼자 패키지는 서로 다른 프로젝트가 동일하지만 서로 다른 버전의 삼자 패키지에 의존하는 것을 가장 흔히 볼 수 있고 가상 환경에서의 설치 패키지는 시스템의 설치 패키지에 영향을 주지 않는다.
그러나 그 구체적인 작업 원리가 어떤지 상세히 소개한다.

소개


거의 모든 언어는 자신의 패키지 관리 도구를 포함하는데 이것은 매우 복잡한 화제이다. 그러나 서로 다른 언어 선택의 실현은 약간의 차이가 있고 선택과 취사를 할 수 있다.한편, Python의 관리 솔루션은 매우 많은데 예를 들어 pip,virtualenv,pyenv 등이다.
그러나 파이썬 언어 자체의 메커니즘이 그 원리를 결정하는 것과 같다.

활용단어참조


비교적 자주 사용하는 것은virtualenv 도구로 Guide to Python의 상세한 소개를 참고할 수 있다. 또한,Python3는 자신의 가상 환경 창설 모듈을 제공하여 창설이 끝난 후에 기본적으로 하나의 스크립트를 통해 독립 환경을 활성화한다.
예를 들어 다음은virtualenv와venv를 사용하는 가상 환경 생성 과정이다.

$ mkdir /tmp/project && cd /tmp/project

$ virtualenv --no-site-packages foobar
$ python3 -m venv foobar
그런 다음 source foobar/bin/activate 명령을 사용하여 새 환경을 활성화할 수 있습니다.

스크립트 활성화


이른바 독립 환경이란 두 가지 문제를 해결하는 것이다. A) Python 해석기가 사용하는 버전을 실행하는 것이다.B) 별도의 패키지를 사용합니다.그 중에서 전자는 리눅스에서 주로 PATH 환경 변수 설정을 통해 activate 스크립트에 다음과 같은 내용이 있다.

VIRTUAL_ENV="/tmp/project/foobar"
export VIRTUAL_ENV

_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH
즉, 생성된 디렉터리를 PATH 환경 변수에 추가하면 이 경로를 우선적으로 찾아서python 해상도의 독립적인 문제를 해결합니다.

작업 원리


독립된 패키지를 사용하려면 import 를 통해 가져올 때 필요한 패키지를 찾는 것이 관건입니다.
패키지의 검색 순서는 파이썬 모듈 프로필에 있는 설명을 볼 수 있습니다. 간단하게 말하면 내장 모듈인지 확인한 다음 sys.path 목록에 지정된 주소에서 검색합니다.그래서 이곳의 관건은 sys.path 목록의 생성이다.

sys에 관하여.prefix


Python을 시작할 때 강한 의존 os.py 패키지를 불러옵니다. 이 패키지를 찾는 것은 해상도의 현재 경로와 고정된 검색 규칙에 따라 이루어집니다.
간단하게 말하면 현재 경로 더하기 lib/python${VERSION}/os.py 를 층층이 위로 찾는 것입니다. 64비트 운영체제라면 lib64 이전의 lib 경로를 대체할 것입니다.
예를 들어 기본 Python3의 해상도 경로는 /usr/bin/python3.6 이고 기본 경로는 /usr/bin/ 이기 때문에 찾기 순서는 입니다.

/usr/bin/lib64/python3.6/os.py
/usr/lib64/python3.6/os.py
/lib64/python3.6/os.py
임의의 경로에서 os.py 패키지를 찾으면 검색을 종료하고 sys.prefix 변수를 설정합니다. 자세한 내용은 strace python 을 통해 볼 수 있습니다. 다음과 같은 검색 경로가 있습니다.

stat("/usr/bin/Modules/Setup", 0x7fffb7146300) = -1 ENOENT (No such file or directory)
stat("/usr/bin/lib64/python2.7/os.py", 0x7fffb71462f0) = -1 ENOENT (No such file or directory)
stat("/usr/bin/lib64/python2.7/os.pyc", 0x7fffb71462f0) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/python2.7/os.py", {st_mode=S_IFREG|0644, st_size=25910, ...}) = 0
os.py를 찾으면 이 경로가 sys.prefix 변수로 설정되고 해상도가 ${sys.prefix}/lib/python${VERSION} 디렉터리에서 패키지를 찾습니다.

총결산


그러면 그 작업 원리는python 해상도를 ${VENV_PATH}/bin/python에 저장한 다음 ${VENV_PATH}/lib/python${VERSION} 디렉터리를 만들고 관련 파일을 이 디렉터리에 복사하면 파일을 복사할 수도 있고 소프트 연결을 사용할 수도 있다.

기타


예를 들어 Python3이라면 내장된 venv 모듈을 직접 사용할 수 있으며 그 원리는 상술한 것과 같고 pyvenv.cfg 프로필을 통해 원시적인 홈 위치를 표시할 수 있다. 이 파일의 내용은 다음과 같다.

home = /usr/bin
include-system-site-packages = false
version = 3.6.8
include-system-site-packagestrue이면 해석기가 시작될 때 시스템 라이브러리를 sys.path에 추가하여 가상 환경import 시스템에 설치된 패키지를 만들 수 있습니다.
Python3에서 제공하는 venv 모듈은 현재 버전에서만 생성할 수 있으며 Python2는 지원되지 않습니다.
Virtualenv 공식 문서를 참고하십시오. 자세한 내용은 이 문서를 참고할 수 있습니다.
Creation of virtual environmentsPython3에서 제공하는 venv 소개는 일반적인 매개 변수와 프로필을 포함합니다.
  ← Older
Python 가상 환경의 작업 원리 해석에 관한 이 글은 여기에 소개되었습니다. 더 많은 Python 가상 환경 원리에 관한 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기