Dengan bantuan mail Guido yang disediakan oleh @kindall, kita dapat memahami proses impor standar seperti mencoba menemukan modul di setiap anggota sys.path, dan file sebagai hasil pencarian ini (detail selengkapnya di PyMOTW Modules and Imports .). Jadi jika modul terletak di jalur absolut sys.pathhasilnya adalah absolut, tetapi jika berada di jalur relatif sys.pathhasilnya adalah relatif.
Sekarang site.pyfile startup hanya menangani pengiriman jalur absolut sys.path, kecuali inisial '', jadi jika Anda tidak mengubahnya dengan cara lain selain menyetel PYTHONPATH (yang jalurnya juga dibuat absolut, sebelum memberi awalan sys.path), Anda akan selalu mendapatkan absolut path, tetapi ketika modul diakses melalui direktori saat ini.
Sekarang jika Anda menipu sys.path dengan cara yang lucu, Anda bisa mendapatkan apa saja.
Sebagai contoh jika Anda memiliki modul sampel foo.pydi /tmp/dengan kode:
import sys
print(sys.path)
print (__file__)
Jika Anda masuk / tmp Anda mendapatkan:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
./foo.py
Ketika masuk /home/user, jika Anda menambahkan /tmpAnda, PYTHONPATHAnda mendapatkan:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
/tmp/foo.py
Bahkan jika Anda menambahkan ../../tmp, itu akan menjadi normal dan hasilnya sama.
Tetapi jika alih-alih menggunakan PYTHONPATHAnda menggunakan secara langsung beberapa jalur lucu Anda mendapatkan hasil yang lucu sebagai penyebabnya.
>>> import sys
>>> sys.path.append('../../tmp')
>>> import foo
['', '/usr/lib/python3.3', .... , '../../tmp']
../../tmp/foo.py
Guido menjelaskan di utas yang dikutip di atas, mengapa python tidak mencoba mengubah semua entri di jalur absolut:
kami tidak ingin memanggil getpwd () pada setiap impor .... getpwd () relatif lambat dan terkadang dapat gagal secara langsung,
Jadi jalan Anda digunakan apa adanya .