Saya kesulitan memahaminya __file__
. Dari apa yang saya pahami, __file__
mengembalikan jalur absolut dari mana modul dimuat.
Saya mengalami masalah saat membuat ini: Saya memiliki abc.py
pernyataan dengan satu print __file__
, berjalan dari /d/projects/
python abc.py
pengembalian abc.py
. lari dari /d/
pengembalian projects/abc.py
. Ada alasan kenapa?
Jawaban:
Dari dokumentasi :
Dari utas milis yang ditautkan oleh @kindall dalam komentar ke pertanyaan:
Untuk selebihnya, pertimbangkan
sys.path
untuk tidak menyertakan''
.Jadi, jika Anda berada di luar bagian
sys.path
yang berisi modul, Anda akan mendapatkan jalur absolut . Jika Anda berada di dalam bagiansys.path
yang berisi modul, Anda akan mendapatkan jalur relatif .Jika Anda memuat modul di direktori saat ini, dan direktori saat ini tidak dalam
sys.path
, Anda akan mendapatkan path absolut.Jika Anda memuat modul di direktori saat ini, dan direktori saat ini ada di dalamnya
sys.path
, Anda akan mendapatkan jalur relatif.sumber
sys.path
, Anda akan mendapatkan path absolut. Jika Anda memuat modul di direktori saat ini, dan direktori saat ini ada di dalamnyasys.path
, Anda akan mendapatkan jalur relatif.sys.path
tidak termasuk''
.__file__
mutlak sejak Python 3.4 , kecuali saat menjalankan skrip secara langsung menggunakan jalur relatif:Tidak yakin apakah itu menyelesaikan symlink.
Contoh melewatkan jalur relatif:
sumber
Python 3.4.0 (default, Apr 11 2014, 13:05:11) [GCC 4.8.2] on linux
). Dan symlink tidak diselesaikan dalam uji coba saya.os.path.realpath(__file__)
cara yang benar untuk menyelesaikan tautan simbolik?Contoh sederhana yang terlambat:
Di bawah Python-2. *, Panggilan kedua salah menentukan
path.abspath(__file__)
berdasarkan direktori saat ini:Seperti dicatat oleh @techtonik, dengan Python 3.4+, ini akan berfungsi dengan baik karena
__file__
mengembalikan jalur absolut.sumber
__main__
modul, di mana__file__
mungkin merupakan jalur relatif.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 absolutsys.path
hasilnya adalah absolut, tetapi jika berada di jalur relatifsys.path
hasilnya adalah relatif.Sekarang
site.py
file startup hanya menangani pengiriman jalur absolutsys.path
, kecuali inisial''
, jadi jika Anda tidak mengubahnya dengan cara lain selain menyetel PYTHONPATH (yang jalurnya juga dibuat absolut, sebelum memberi awalansys.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.py
di/tmp/
dengan kode:Jika Anda masuk / tmp Anda mendapatkan:
Ketika masuk
/home/user
, jika Anda menambahkan/tmp
Anda,PYTHONPATH
Anda mendapatkan:Bahkan jika Anda menambahkan
../../tmp
, itu akan menjadi normal dan hasilnya sama.Tetapi jika alih-alih menggunakan
PYTHONPATH
Anda menggunakan secara langsung beberapa jalur lucu Anda mendapatkan hasil yang lucu sebagai penyebabnya.Guido menjelaskan di utas yang dikutip di atas, mengapa python tidak mencoba mengubah semua entri di jalur absolut:
Jadi jalan Anda digunakan apa adanya .
sumber