Python의 sys.path는 어디에서 초기화됩니까?


111

Python의 sys.path는 어디에서 초기화됩니까?

UPD : Python은 PYTHONPATH를 참조하기 전에 몇 가지 경로를 추가합니다.

    >>> import sys
    >>> from pprint import pprint as p
    >>> p(sys.path)
    ['',
     'C:\\Python25\\lib\\site-packages\\setuptools-0.6c9-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\orbited-0.7.8-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\morbid-0.8.6.1-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\demjson-1.4-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\stomper-0.2.2-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\uuid-1.30-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\stompservice-0.1.0-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\cherrypy-3.0.1-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\pyorbited-0.2.2-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\flup-1.0.1-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\wsgilog-0.1-py2.5.egg',
     'c:\\testdir',
     'C:\\Windows\\system32\\python25.zip',
     'C:\\Python25\\DLLs',
     'C:\\Python25\\lib',
     'C:\\Python25\\lib\\plat-win',
     'C:\\Python25\\lib\\lib-tk',
     'C:\\Python25',
     'C:\\Python25\\lib\\site-packages',
     'C:\\Python25\\lib\\site-packages\\PIL',
     'C:\\Python25\\lib\\site-packages\\win32',
     'C:\\Python25\\lib\\site-packages\\win32\\lib',
     'C:\\Python25\\lib\\site-packages\\Pythonwin']

내 PYTHONPATH는 다음과 같습니다.

    PYTHONPATH=c:\testdir

PYTHONPATH 이전의 경로가 어디에서 왔는지 궁금합니다.

답변:



77

파이썬은 정말 지능적으로 sys.path. 설정 방법은 정말 복잡해질 수 있습니다 . 다음 가이드는 파이썬 수치는 무엇을로 사용할에서 때 발생의 평 조합원 파이썬 프로그래머를위한 물을 다운 다소-불완전 다소-잘못, 그러나 희망 유용한 가이드 초기 값sys.path, sys.executable, sys.exec_prefix, 및 sys.prefixA의 일반 파이썬 설치.

첫째, 파이썬은 운영체제가 말하는 것을 기반으로 파일 시스템에서 실제 물리적 위치를 파악하기 위해 최선을 다합니다. OS가 "python"이 실행 중이라고 만 표시하면 $ PATH에서 자신을 찾습니다. 모든 심볼릭 링크를 해결합니다. 이 작업을 수행하면 찾은 실행 파일의 경로가 sys.executable, no ifs, ands 또는 buts 의 값으로 사용됩니다 .

다음으로 sys.exec_prefix및 의 초기 값을 결정합니다 sys.prefix.

pyvenv.cfg같은 디렉토리 sys.executable또는 하나의 디렉토리에 호출 된 파일이 있으면 파이썬은 파일을 찾습니다. 다른 OS는이 파일로 다른 작업을 수행합니다.

파이썬이 찾는이 구성 파일의 값 중 하나는 구성 옵션 home = <DIRECTORY>입니다. Python은 나중에 sys.executable 초기 값을 동적으로 설정할 때 포함하는 디렉토리 대신이 디렉토리를 사용합니다 sys.prefix. 는 IF applocal = true설정이 나타납니다 pyvenv.cfgWindows에서 파일이 아니라 home = <DIRECTORY>설정, 다음 sys.prefix이 들어있는 디렉토리로 설정됩니다 sys.executable.

다음으로 PYTHONHOME환경 변수를 검사합니다. 리눅스 및 Mac에서 sys.prefixsys.exec_prefix받는 설정 PYTHONHOME이 존재하는 경우, 환경 변수 에 우선 어떤 home = <DIRECTORY>에서 설정을 pyvenv.cfg. Windows에서 sys.prefixsys.exec_prefix받는 설정 PYTHONHOME은, 존재하는 경우, 환경 변수 를 제외home = <DIRECTORY> 설정이 존재에 pyvenv.cfg대신 사용됩니다.

그렇지 않으면 의 위치 또는에서 제공 한 디렉토리 (있는 경우) 에서 뒤로 걸어 가면 이러한 sys.prefixsys.exec_prefix을 찾을 수 있습니다.sys.executablehomepyvenv.cfg

파일 lib/python<version>/dyn-load이 해당 디렉토리 또는 상위 디렉토리에서 발견되면 해당 디렉토리는 sys.exec_prefixLinux 또는 Mac에 있도록 설정됩니다 . 파일 lib/python<version>/os.py이 디렉토리 또는 하위 디렉토리에있는 경우 해당 디렉토리는 sys.prefixLinux, Mac 및 Windows에 있고 Windows와 sys.exec_prefix동일한 값으로 설정됩니다 sys.prefix. 이 applocal = true설정되어있는 경우 Windows에서는이 전체 단계를 건너 뜁니다 . 의 디렉토리 sys.executable가 사용되거나에 home설정된 경우 pyvenv.cfg초기 값 대신 사용됩니다 sys.prefix.

이러한 "랜드 마크"파일을 찾을 수 없거나 sys.prefix아직 찾지 못한 경우 python은 sys.prefix"대체"값으로 설정 합니다. 예를 들어 Linux 및 Mac에서는 사전 컴파일 된 기본값을 sys.prefix및 의 값으로 사용 sys.exec_prefix합니다. Windows는에 sys.path대한 대체 값을 설정하기 위해가 완전히 파악 될 때까지 기다립니다 sys.prefix.

그런 다음 (여러분 모두 기다려온 것) python은에 포함될 초기 값을 결정합니다 sys.path.

  1. 파이썬이 실행하고있는 스크립트의 디렉토리가에 추가됩니다 sys.path. Windows에서는 항상 빈 문자열로, 대신 스크립트가있는 전체 경로를 사용하도록 Python에 지시합니다.
  2. PYTHONPATH 환경 변수의 내용은, 설정 한 경우에 추가되고 sys.path, 하지 않는 한 Windows에서이고 applocal사실에로 설정됩니다 pyvenv.cfg.
  3. <prefix>/lib/python35.zipLinux / Mac 및 os.path.join(os.dirname(sys.executable), "python.zip")Windows 에 있는 zip 파일 경로 가 sys.path.
  4. Windows에서 no applocal = true가에 설정되어 있지 않으면 pyvenv.cfg레지스트리 키의 하위 키 내용 HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\이 추가됩니다 (있는 경우).
  5. Windows에서와 어떤 경우는 applocal = true에 설정 pyvenv.cfg하고 sys.prefix, 다음을 찾을 수 없습니다 핵심 내용 레지스트리 키의의를 HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\존재하는 경우, 추가;
  6. Windows에서 no applocal = true가에 설정되어 있지 않으면 pyvenv.cfg레지스트리 키의 하위 키 내용 HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\이 추가됩니다 (있는 경우).
  7. Windows에서와 어떤 경우는 applocal = true에 설정 pyvenv.cfg하고 sys.prefix, 다음을 찾을 수 없습니다 핵심 내용 레지스트리 키의의를 HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\존재하는 경우, 추가;
  8. Windows에서 PYTHONPATH가 설정되지 않았고 접두사가없고 레지스트리 키가없는 경우 PYTHONPATH의 상대 컴파일 시간 값이 추가됩니다. 그렇지 않으면이 단계가 무시됩니다.
  9. 컴파일 타임 매크로 PYTHONPATH의 경로는 dynamic-found에 상대적으로 추가됩니다 sys.prefix.
  10. Mac 및 Linux에서는의 값 sys.exec_prefix이 추가됩니다. Windows에서는 동적으로 검색하는 데 사용되었거나 사용되었을 디렉토리 sys.prefix가 추가됩니다.

Windows의이 단계에서 접두사가 없으면 Python은 이전 의 디렉터리에서 시도한 것처럼 모든 디렉터리에서 sys.path랜드 마크 파일 을 검색 하여 sys.executable무언가를 찾을 때까지이를 확인 하려고합니다 . 그렇지 않은 경우 sys.prefix비워 둡니다.

마지막으로,이 모든 작업이 끝나면 Python은 site모듈을 로드합니다 sys.path.

머리 부분과 꼬리 부분에서 최대 4 개의 디렉터리를 구성하는 것으로 시작합니다. 머리 부분에는 sys.prefixsys.exec_prefix; 빈 머리는 건너 뜁니다. 꼬리 부분의 경우 빈 문자열을 사용한 다음 lib/site-packages(Windows) 또는 lib/pythonX.Y/site-packages 다음 lib/site-python(Unix 및 Macintosh)을 사용합니다. 각 헤드-테일 조합에 대해 기존 디렉토리를 참조하는지 확인하고, 그렇다면 sys.path에 추가하고 구성 파일에 대해 새로 추가 된 경로도 검사합니다.


1
문서가 말하는 내용에도 불구하고 sys.executable심볼릭 링크가 될 수도 있고 argv[0]슬래시 가 포함되어 있으면 실제로는 무엇이든 될 수 있습니다 . 실행 파일 의 실제 경로 ( execv(path, argv)호출에서)는 사용되지 않습니다.
jfs

1
sys.pathWindows 10에 대한 첫 번째 요점에 관하여 : 저는 항상 내 스크립트 디렉토리의 전체 경로를 sys.path [0] (cwd ''아님)로 얻습니다. 당신은 다음과 같은 것을 실행할 수 있어야합니다python some\other\path\than\cwd\main.py
ford04

@ ford04에 동의합니다. 포인트 1이 잘못됨 : Windows에서 스크립트의 디렉토리는 빈 경로 나 cwd가 아닌 sys.path에 추가됩니다. 이것은 다양한 Python 3.x 설치에 있습니다.
gwideman nov.

1
와, 이거 대단해! 나는이 "진실"에 걸림돌이되기 전에 약 10 개의 다른 질문과 답변을 보았습니다. 비록 당신이 모든 것을 가지고 있지 않다는 것을 인정하지만 겸손하게 말하고 있습니다.
마이크 윌리엄슨

1
site-packageshave .pth.egg-linksuffixes 에 관련 파일을 추가합니다 .
florisla
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.