Với sự trợ giúp của thư Guido do @kindall cung cấp, chúng tôi có thể hiểu quy trình nhập tiêu chuẩn khi cố gắng tìm mô-đun trong từng thành viên sys.pathvà tệp là kết quả của việc tra cứu này (thêm chi tiết trong Mô-đun và Nhập PyMOTW .). Vì vậy, nếu mô-đun được đặt trong một đường dẫn tuyệt đối trong sys.pathkết quả là tuyệt đối, nhưng nếu nó nằm trong một đường dẫn tương đối trong sys.pathkết quả là tương đối.
Bây giờ site.pytệp khởi động sẽ chỉ cung cấp đường dẫn tuyệt đối trong sys.path, ngoại trừ đường dẫn đầu tiên '', vì vậy nếu bạn không thay đổi nó bằng cách khác ngoài việc đặt PYTHONPATH (đường dẫn của nó cũng được đặt là tuyệt đối, trước tiền tố sys.path), bạn sẽ luôn nhận được đường dẫn tuyệt đối nhưng khi mô-đun được truy cập thông qua thư mục hiện tại.
Bây giờ nếu bạn lừa sys.path một cách hài hước, bạn có thể lấy được bất cứ thứ gì.
Một ví dụ nếu bạn có một mô-đun mẫu foo.pytrong /tmp/với mã:
import sys
print(sys.path)
print (__file__)
Nếu bạn vào / tmp, bạn sẽ nhận được:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
./foo.py
Khi vào /home/user, nếu bạn thêm /tmpbạn PYTHONPATHsẽ nhận được:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
/tmp/foo.py
Ngay cả khi bạn thêm ../../tmp, nó sẽ được chuẩn hóa và kết quả là như nhau.
Nhưng nếu thay vì sử dụng, PYTHONPATHbạn sử dụng trực tiếp một số đường dẫn vui nhộn, bạn sẽ nhận được kết quả là nguyên nhân gây cười.
>>> import sys
>>> sys.path.append('../../tmp')
>>> import foo
['', '/usr/lib/python3.3', .... , '../../tmp']
../../tmp/foo.py
Guido giải thích trong chuỗi trích dẫn ở trên, tại sao python không cố gắng chuyển đổi tất cả các mục nhập theo đường dẫn tuyệt đối:
chúng tôi không muốn phải gọi getpwd () trên mỗi lần nhập .... getpwd () tương đối chậm và đôi khi có thể bị lỗi hoàn toàn,
Vì vậy, đường dẫn của bạn được sử dụng như nó vốn có .