Python'un sys.path'i nereden başlatılır?


111

Python'un sys.path'i nereden başlatılır?

UPD : Python, PYTHONPATH'a başvurmadan önce bazı yollar ekliyor:

    >>> 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'ım:

    PYTHONPATH=c:\testdir

PYTHONPATH'tan önceki bu yollar nereden geliyor acaba?

Yanıtlar:



77

Python gerçekten akıllıca ayarlamak için çok çalışıyor sys.path. Nasıl ayarlandığı gerçekten karmaşıklaşabilir . Aşağıdaki kılavuz piton rakamlar neyi olarak kullanmak için dışarı ne olur rütbesi ve dosya piton programcı için bir sulandırılmış, biraz-tamamlanmamış, biraz-yanlış, ama umarım-kullanışlı bir kılavuzdur başlangıç değerleri arasında sys.path, sys.executable, sys.exec_prefixve sys.prefixbir üzerinde normal bir piton yüklemesi.

İlk olarak, python işletim sisteminin söylediklerine bağlı olarak dosya sistemindeki gerçek fiziksel konumunu bulmak için elinden gelenin en iyisini yapar. İşletim sistemi sadece "python" çalıştığını söylüyorsa, kendisini $ PATH içinde bulur. Herhangi bir sembolik bağı çözer. Bunu yaptıktan sonra, bulduğu yürütülebilir dosyanın yolu, sys.executableifs, ands veya buts yok , değer olarak kullanılır .

Daha sonra, başlangıç değerlerini tespit eder sys.exec_prefixve sys.prefix.

pyvenv.cfgAynı dizinde sys.executableveya bir dizin üstte çağrılan bir dosya varsa , python ona bakar. Farklı işletim sistemleri bu dosya ile farklı şeyler yapar.

Python'un aradığı bu yapılandırma dosyasındaki değerlerden biri yapılandırma seçeneğidir home = <DIRECTORY>. Python sys.executable , sys.prefixdaha sonrasının ilk değerini dinamik olarak ayarladığında içeren dizin yerine bu dizini kullanacaktır . Eğer applocal = trueayar görünen pyvenv.cfgWindows üzerinde dosyaya değil, home = <DIRECTORY>ayar, daha sonra sys.prefixiçeren dizine kurulacaktır sys.executable.

Ardından PYTHONHOMEortam değişkeni incelenir. Linux ve Mac'te sys.prefixve varsa ortam değişkenine sys.exec_prefixayarlıdır, içindeki herhangi bir ayarın yerini alır . Windows'ta ve bunun yerine kullanılan bir ayar olmadığı sürece , varsa ortam değişkenine ayarlanır .PYTHONHOMEhome = <DIRECTORY>pyvenv.cfgsys.prefixsys.exec_prefixPYTHONHOMEhome = <DIRECTORY>pyvenv.cfg

Aksi halde, bu sys.prefixve sys.exec_prefixyerini yürüme geriye doğru tarafından bulunur sys.executable, ya hometarafından verilen dizinde pyvenv.cfgvarsa.

Dosya lib/python<version>/dyn-loadbu dizinde veya üst dizinlerinden herhangi birinde bulunursa, bu dizin sys.exec_prefixLinux veya Mac'te olacak şekilde ayarlanır . Dosya lib/python<version>/os.pydizinde veya alt dizinlerinden herhangi birinde bulunursa, bu dizin sys.prefixLinux, Mac ve Windows'ta Windows'dakiyle sys.exec_prefixaynı değere ayarlanacak şekilde ayarlanır sys.prefix. Ayarlandıysa tüm bu adım Windows'ta atlanır applocal = true. Ya dizini sys.executablekullanılır ya da eğer homeayarlanmışsa pyvenv.cfg, onun başlangıç ​​değeri yerine kullanılır sys.prefix.

Bu "dönüm noktası" dosyalarını bulamazsa veya sys.prefixhenüz bulunamazsa, python sys.prefixbir "geri dönüş" değerine ayarlanır . Linux ve Mac, örneğin, kullanım değerleri olarak varsayılan-derlenmiş ön sys.prefixve sys.exec_prefix. Windows sys.path, için bir geri dönüş değeri ayarlamak için tam olarak anlaşılana kadar bekler sys.prefix.

Ardından, (hepinizin beklediği) python, içerilecek ilk değerleri belirler sys.path.

  1. Python'un çalıştırdığı betiğin dizini eklenir sys.path. Windows'ta bu her zaman boş dizedir ve python'a betiğin bulunduğu yerin tam yolunu kullanmasını söyler.
  2. PYTHONPATH ortam değişkeninin içeriği setine eğer eklenir sys.path, sürece Windows üzerinde konum ve applocalgerçek in olarak ayarlanır pyvenv.cfg.
  3. <prefix>/lib/python35.zipLinux / Mac ve os.path.join(os.dirname(sys.executable), "python.zip")Windows'ta bulunan zip dosyası yolu sys.path.
  4. Windows'daysa ve hiçbir applocal = trueayar yapılmamışsa pyvenv.cfg, varsa kayıt defteri anahtarının alt anahtarlarının içeriği HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\eklenir.
  5. Windows'ta hiçbir applocal = trueayar yapılmamışsa pyvenv.cfgve sys.prefixbulunamıyorsa, varsa kayıt defteri anahtarının temel içeriğiHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ eklenir;
  6. Windows'daysa ve hiçbir applocal = trueayar yapılmamışsa pyvenv.cfg, varsa kayıt defteri anahtarının alt anahtarlarının içeriği HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\eklenir.
  7. Windows'ta hiçbir applocal = trueayar yapılmamışsa pyvenv.cfgve sys.prefixbulunamıyorsa, varsa kayıt defteri anahtarının temel içeriğiHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ eklenir;
  8. Windows'ta ve PYTHONPATH ayarlanmamışsa, önek bulunmazsa ve kayıt defteri anahtarı yoksa, PYTHONPATH'ın göreceli derleme zamanı değeri eklenir; aksi takdirde bu adım dikkate alınmaz.
  9. Derleme zamanı makrosundaki yollar PYTHONPATH dinamik olarak bulunanlara göre eklenir sys.prefix.
  10. Mac ve Linux'ta değeri sys.exec_prefixeklenir. Windows'ta, dinamik olarak arama yapmak için kullanılan (veya kullanılacak olan) dizin sys.prefixeklenir.

Windows'ta bu aşamada, eğer bir önek bulunamazsa, python, bir şey bulana kadar , daha önce dizini ile yapmaya çalıştığı gibi, dönüm noktası dosyaları için tüm dizinleri arayarak belirlemeye çalışacaktır . Aksi takdirde boş bırakılır.sys.pathsys.executablesys.prefix

Son olarak, tüm sitebunlardan sonra Python modülü yükler ve bu da aşağıdakilere daha da fazla şeyler ekler sys.path:

Bir baş ve bir kuyruk bölümünden en fazla dört dizin oluşturarak başlar. Baş kısmı için kullanır sys.prefixve sys.exec_prefix; boş kafalar atlanır. Kuyruk kısmı için, boş dizeyi ve ardından lib/site-packages(Windows'ta) veya lib/pythonX.Y/site-packages ardından lib/site-python(Unix ve Macintosh'ta) kullanır. Farklı head-tail kombinasyonlarının her biri için, mevcut bir dizine atıfta bulunup bulunmadığını görür ve öyleyse, onu sys.path'e ekler ve ayrıca yapılandırma dosyaları için yeni eklenen yolu inceler.


1
Dokümanlarının söylediğine rağmen, sys.executablebir sembolik bağlantı olabilir veya argv[0]eğik çizgi içeren herhangi bir şey olabilir . Yürütülebilir dosyanın gerçek yolu ( execv(path, argv)çağrıdan) kullanılmaz.
jfs

1
sys.pathWindows 10 için ilk noktanızla ilgili olarak: Komut dizimin tam yolunu her zaman sys.path [0] olarak alırım (cwd değil ''). Gibi bir şey yürütmek gerekirpython some\other\path\than\cwd\main.py
ford04

@ Ford04'e katılıyorum. Nokta 1 yanlış: Windows'da komut dosyasının dizini boş bir yol veya cwd değil, sys.path'e eklenir. Bu, çeşitli Python 3.x kurulumlarındadır.
gwideman

1
Vay canına, bu harika! Tam olarak her şeye sahip olmadığınızı itiraf ediyor olsanız da, bu "gerçek" e rastlamadan önce yaklaşık 10 soru ve cevap daha gördüm.
Mike Williamson

1
Bu ilgili dosyaları site-packagessahip .pthve .egg-linkson eklere eklerim .
florisla
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.