Với sự trợ giúp của thư Guido được cung cấp bởi @kindall, chúng tôi có thể hiểu quy trình nhập chuẩn khi tìm mô-đun trong mỗi thành viên sys.path
và tệp là kết quả của tra cứu này (chi tiết hơn trong PyMOTW Modules and Imports.). Vì vậy, nếu mô-đun được đặt trong đường dẫn tuyệt đối trong sys.path
kết quả là tuyệt đối, nhưng nếu nó nằm trong đường dẫn tương đối trong sys.path
kết quả là tương đối.
Bây giờ tập tin site.py
khởi động chăm sóc của việc cung cấp chỉ đường dẫn tuyệt đối trong sys.path
, ngoại trừ ban đầu ''
, vì vậy nếu bạn không thay đổi nó bằng các phương tiện khác hơn là thiết lập PYTHONPATH (có đường cũng được thực hiện tuyệt đối, trước khi tiền tố sys.path
), bạn sẽ luôn nhận được một đườ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 theo cách hài hước, bạn có thể nhận bất kỳ thứ gì.
Một ví dụ nếu bạn có một mô-đun mẫu foo.py
trong /tmp/
với mã:
import sys
print(sys.path)
print (__file__)
Nếu bạn đi trong/tmp bạn nhận được:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
./foo.py
Khi ở trong /home/user
, nếu bạn thêm /tmp
của bạn PYTHONPATH
bạn 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 PYTHONPATH
bạ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ả hài hước như nguyên nhân.
>>> import sys
>>> sys.path.append('../../tmp')
>>> import foo
['', '/usr/lib/python3.3', .... , '../../tmp']
../../tmp/foo.py
Guido giải thích trong các chủ đề nêu trên, tại sao python không nên cố gắng để chuyển đổi tất cả các mục trong đường dẫn tuyệt đối:
chúng tôi không muốn phải gọi getpwd() trên mỗi khẩu. ... getpwd() là tương đối chậm và đôi khi có thể thất bại hoàn toàn,
vì vậy, con đường của bạn được sử dụng vì nó là.
Đây là những gì Guido phải nói về điều này: http://mail.python.org/pipermail/python-dev/2010-February/097461.html – kindall
Liên quan: https://stackoverflow.com/q/9271464/ 1959808 –