sys.path ของ Python เริ่มต้นจากที่ไหน


112

sys.path ของ Python เริ่มต้นจากที่ไหน

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 มาจากไหน?

คำตอบ:


49

"เริ่มต้นจากตัวแปรสภาพแวดล้อม PYTHONPATH บวกค่าเริ่มต้นที่ขึ้นกับการติดตั้ง"

- http://docs.python.org/library/sys.html#sys.path


7
ฉันเดาว่ามาจากโมดูลของไซต์: docs.python.org/library/site.html
ashcatch

20
โมดูลไซต์โหลดและแยกวิเคราะห์เนื้อหาของไฟล์. pth ในไดเร็กทอรีไซต์แพ็กเกจของคุณ ไฟล์. pth เหล่านี้มีส่วนเพิ่มเติมใน PYTHONPATH ของคุณ
ASk

77

sys.pathงูหลามจริงๆพยายามอย่างหนักที่จะตั้งอย่างชาญฉลาด วิธีการที่จะมีการตั้งค่าจะได้รับจริงๆ ซับซ้อน แนะนำต่อไปนี้คือการรดน้ำลงค่อนข้าง-สมบูรณ์ค่อนข้างผิด แต่หวังว่ามีประโยชน์คู่มือสำหรับยศและไฟล์โปรแกรมเมอร์หลามของสิ่งที่เกิดขึ้นเมื่อตัวเลขหลามออกว่าจะใช้เป็นค่าเริ่มต้นของsys.path, sys.executable, sys.exec_prefixและsys.prefixในการ ติดตั้งหลามปกติ

อันดับแรก python ทำระดับได้ดีที่สุดในการหาตำแหน่งทางกายภาพที่แท้จริงบนระบบไฟล์ตามสิ่งที่ระบบปฏิบัติการบอก หากระบบปฏิบัติการแจ้งว่า "python" กำลังทำงานอยู่ระบบจะพบว่าตัวเองอยู่ใน $ PATH มันแก้ไขลิงก์สัญลักษณ์ใด ๆ เมื่อดำเนินการเสร็จแล้วเส้นทางของไฟล์ปฏิบัติการที่พบจะถูกใช้เป็นค่าสำหรับsys.executableไม่มี ifs และหรือ buts

ถัดไปก็จะเป็นตัวกำหนดค่าเริ่มต้นสำหรับการและsys.exec_prefix sys.prefix

หากมีไฟล์ที่เรียกpyvenv.cfgในไดเร็กทอรีเดียวกัน sys.executableหรือขึ้นมาหนึ่งไดเร็กทอรี python จะดูที่ไฟล์นั้น ระบบปฏิบัติการที่แตกต่างกันทำสิ่งต่างๆกับไฟล์นี้

หนึ่งในค่านิยมในไฟล์ config home = <DIRECTORY>ที่หลามมองหาตัวเลือกการกำหนดค่า Python จะใช้ไดเร็กทอรีนี้แทนไดเร็กทอรีที่มีsys.executable เมื่อตั้งค่าเริ่มต้นแบบไดนามิกในsys.prefixภายหลัง หากการapplocal = trueตั้งค่าปรากฏใน pyvenv.cfgไฟล์บน Windows แต่ไม่ใช่การhome = <DIRECTORY>ตั้งค่าระบบsys.prefixจะตั้งค่าเป็นไดเร็กทอรีที่มีsys.executable.

จากPYTHONHOMEนั้นตรวจสอบตัวแปรสภาพแวดล้อม บน Linux และ Mac sys.prefixและsys.exec_prefixตั้งค่าเป็นPYTHONHOMEตัวแปรสภาพแวดล้อมหากมีอยู่จะแทนที่home = <DIRECTORY>การตั้งค่าใด ๆในpyvenv.cfg. บน Windows sys.prefixและsys.exec_prefixถูกตั้งค่าเป็นPYTHONHOMEตัวแปรสภาพแวดล้อมหากมีอยู่เว้นแต่จะมีhome = <DIRECTORY>การตั้งค่าอยู่pyvenv.cfgซึ่งจะใช้แทน

มิฉะนั้นเหล่านี้sys.prefixและsys.exec_prefixจะพบได้โดยการย้อนกลับเดินจากสถานที่ตั้งของsys.executableหรือhomeไดเรกทอรีที่กำหนดโดยpyvenv.cfgถ้ามี

หากlib/python<version>/dyn-loadพบไฟล์ในไดเร็กทอรีนั้นหรือไดเร็กทอรีพาเรนต์ไดเร็กทอรีนั้นจะถูกกำหนดให้เป็น sys.exec_prefixบน Linux หรือ Mac หากพบไฟล์ lib/python<version>/os.pyในไดเร็กทอรีหรือไดเร็กทอรีย่อยใด ๆ ไดเร็กทอรีนั้นจะถูกกำหนดให้อยู่sys.prefixบน Linux, Mac และ Windows โดยsys.exec_prefixตั้งค่าเป็นค่าเดียว sys.prefixกับบน Windows ขั้นตอนทั้งหมดนี้จะข้ามไปใน Windows หาก applocal = trueตั้งค่าไว้ ไดเร็กทอรีของsys.executableถูกใช้หรือถ้าhomeถูกตั้งค่าไว้pyvenv.cfgซึ่งจะใช้แทนค่าเริ่มต้นของsys.prefix.

หากไม่พบไฟล์ "จุดสังเกต" เหล่านี้หรือsys.prefixยังไม่พบ python sys.prefixจะตั้งค่าเป็น "ทางเลือก" Linux และ Mac, ตัวอย่างเช่นการใช้ค่าเริ่มต้นก่อนรวบรวมเป็นค่าของและsys.prefix sys.exec_prefixหน้าต่างรอจนกว่าจะคิดออกอย่างเต็มที่ในการตั้งค่าทางเลือกสำหรับsys.path sys.prefix

จากนั้น (สิ่งที่คุณได้รับการรอคอย) sys.pathหลามกำหนดค่าเริ่มต้นที่จะมีอยู่ใน

  1. sys.pathไดเรกทอรีของสคริปต์ซึ่งหลามกำลังดำเนินการจะถูกเพิ่ม ใน Windows จะเป็นสตริงว่างเสมอซึ่งจะบอกให้ python ใช้เส้นทางแบบเต็มที่สคริปต์ตั้งอยู่แทน
  2. เนื้อหาของตัวแปรสภาพแวดล้อม PYTHONPATH ถ้าชุดจะถูกเพิ่มsys.path, เว้นแต่คุณจะอยู่บน Windows และมีการตั้งค่าในความจริงapplocalpyvenv.cfg
  3. เส้นทางไฟล์ zip ซึ่งอยู่<prefix>/lib/python35.zipบน Linux / Mac และ os.path.join(os.dirname(sys.executable), "python.zip")บน Windows จะถูกเพิ่มลงในsys.pathไฟล์.
  4. หากใน Windows และไม่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 และไม่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 sys.prefixรวบรวมเวลาที่มีการเพิ่มเทียบกับแบบไดนามิกพบ
  10. บน Mac และ Linux ค่าของsys.exec_prefixจะถูกเพิ่ม บน Windows, ไดเรกทอรีที่ใช้ (หรือจะได้รับใช้) เพื่อค้นหาแบบไดนามิกสำหรับsys.prefixถูกเพิ่ม

ในขั้นตอนนี้บน Windows หากไม่พบคำนำหน้า python จะพยายามกำหนดโดยค้นหาไดเรกทอรีทั้งหมดในsys.pathไฟล์จุดสังเกตตามที่พยายามทำกับไดเรกทอรีsys.executableก่อนหน้านี้จนกว่าจะพบบางสิ่ง ถ้าไม่มีให้sys.prefixเว้นว่างไว้

สุดท้ายหลังจากทั้งหมดนี้ Python จะโหลดsiteโมดูลซึ่งจะเพิ่มสิ่งต่างๆไปยังsys.path:

เริ่มต้นด้วยการสร้างไดเร็กทอรีสูงสุดสี่ไดเร็กทอรีจากส่วนหัวและส่วนท้าย สำหรับส่วนหัวจะใช้sys.prefixและsys.exec_prefix; หัวว่างถูกข้ามไป สำหรับส่วนหางจะใช้สตริงว่างจากนั้นlib/site-packages(บน Windows) หรือlib/pythonX.Y/site-packages จากนั้นlib/site-python(บน Unix และ Macintosh) สำหรับชุดค่าผสม head-tail ที่แตกต่างกันแต่ละชุดจะตรวจสอบว่าอ้างถึงไดเร็กทอรีที่มีอยู่หรือไม่และหากเป็นเช่นนั้นให้เพิ่มลงใน sys.path และตรวจสอบเส้นทางที่เพิ่มใหม่สำหรับไฟล์คอนฟิกูเรชัน


1
แม้ว่าเอกสารจะพูดอะไร แต่sys.executableอาจเป็น symlink หรือจริงๆแล้วอาจเป็นอะไรก็ได้หากargv[0]มีเครื่องหมายทับ ไม่ได้ใช้พา ธจริงไปยังไฟล์ปฏิบัติการ (จากการexecv(path, argv)โทร)
jfs

1
เกี่ยวกับจุดแรกของคุณsys.pathใน windows 10: ฉันมักจะได้รับเส้นทางแบบเต็มของสคริปต์ dir ของฉันเป็น sys.path [0] (ไม่ใช่ cwd '') คุณควรจะสามารถดำเนินการบางอย่างเช่นpython some\other\path\than\cwd\main.py
ford04

ฉันเห็นด้วยกับ @ ford04 จุดที่ 1 ไม่ถูกต้อง: ใน Windows ไดเร็กทอรีของสคริปต์จะถูกเพิ่มลงใน sys.path ไม่ใช่พา ธ ว่างหรือ cwd นี่คือในการติดตั้ง Python 3.x ต่างๆ
gwideman

1
ว้าวมันยอดเยี่ยมมาก! ฉันเห็นคำถามและคำตอบอื่น ๆ อีกประมาณ 10 คำถามก่อนที่จะสะดุดกับเรื่องนี้นั่นคือ "ความจริง" แม้ว่าคุณจะรู้สึกถ่อมตัวยอมรับว่าคุณมีไม่ครบทั้งหมด
Mike Williamson

1
ฉันจะเพิ่มไฟล์ที่เกี่ยวข้องในsite-packageshave .pthและ.egg-linkส่วนต่อท้าย
florisla
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.