ด้วยความช่วยเหลือของอีเมล Guido ที่จัดทำโดย @kindall เราสามารถเข้าใจกระบวนการนำเข้ามาตรฐานขณะพยายามค้นหาโมดูลในสมาชิกแต่ละคนsys.pathและไฟล์อันเป็นผลมาจากการค้นหานี้ (รายละเอียดเพิ่มเติมในโมดูล PyMOTW และการนำเข้า ) ดังนั้นหากโมดูลตั้งอยู่ในพา ธ สัมบูรณ์ในsys.pathผลลัพธ์จะเป็นค่าสัมบูรณ์ แต่ถ้าโมดูลนั้นอยู่ในพา ธสัมพัทธ์ในsys.pathผลลัพธ์จะสัมพันธ์กัน
ตอนนี้site.pyไฟล์เริ่มต้นดูแลการส่งเฉพาะพา ธ สัมบูรณ์ในsys.pathยกเว้นค่าเริ่มต้น''ดังนั้นหากคุณไม่เปลี่ยนด้วยวิธีอื่นนอกเหนือจากการตั้งค่า PYTHONPATH (ซึ่งพา ธ ถูกสร้างเป็นค่าสัมบูรณ์ก่อนที่จะนำหน้าsys.path) คุณจะได้ค่าสัมบูรณ์เสมอ เส้นทาง แต่เมื่อโมดูลถูกเข้าถึงผ่านไดเร็กทอรีปัจจุบัน
ตอนนี้ถ้าคุณหลอก sys.path ด้วยวิธีตลก ๆ คุณจะได้อะไรก็ได้
ตัวอย่างเช่นถ้าคุณมีโมดูลตัวอย่างfoo.pyใน/tmp/กับรหัส:
import sys
print(sys.path)
print (__file__)
หากคุณเข้าไป / tmp คุณจะได้รับ:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
./foo.py
เมื่ออยู่ในใน/home/userถ้าคุณเพิ่ม/tmpของคุณPYTHONPATHคุณจะได้รับ:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
/tmp/foo.py
แม้ว่าคุณจะเพิ่ม../../tmpมันจะถูกทำให้เป็นมาตรฐานและผลลัพธ์ก็เหมือนกัน
แต่ถ้าแทนที่จะใช้PYTHONPATHคุณใช้เส้นทางตลก ๆ โดยตรงคุณจะได้ผลลัพธ์ที่ตลกพอ ๆ กับสาเหตุ
>>> import sys
>>> sys.path.append('../../tmp')
>>> import foo
['', '/usr/lib/python3.3', .... , '../../tmp']
../../tmp/foo.py
Guido อธิบายในหัวข้อที่อ้างถึงข้างต้นทำไม python ไม่พยายามแปลงรายการทั้งหมดในเส้นทางที่แน่นอน:
เราไม่ต้องการเรียก getpwd () ในทุกการนำเข้า .... getpwd () ค่อนข้างช้าและบางครั้งอาจล้มเหลวทันที
ดังนั้นเส้นทางของคุณจะใช้มันเป็น