Saya akan mencoba menangani beberapa variasi pada pertanyaan ini juga:
- menemukan jalur skrip yang disebut
- menemukan jalur skrip yang sedang dijalankan
- menemukan direktori skrip yang dipanggil
(Beberapa pertanyaan ini telah diajukan pada SO, tetapi telah ditutup sebagai duplikat dan dialihkan ke sini.)
Peringatan Penggunaan __file__
Untuk modul yang telah Anda impor:
import something
something.__file__
akan mengembalikan jalur absolut modul. Namun, mengingat skrip berikut foo.py:
#foo.py
print '__file__', __file__
Menyebutnya dengan 'python foo.py' Akan kembali hanya 'foo.py'. Jika Anda menambahkan shebang:
#!/usr/bin/python
#foo.py
print '__file__', __file__
dan menyebutnya dengan ./foo.py, ia akan mengembalikan './foo.py'. Memanggilnya dari direktori yang berbeda, (misalnya memasukkan foo.py di bilah direktori), lalu memanggil keduanya
python bar/foo.py
atau menambahkan shebang dan mengeksekusi file secara langsung:
bar/foo.py
akan mengembalikan 'bar / foo.py' ( jalur relatif ).
Menemukan direktori
Sekarang pergi dari sana untuk mendapatkan direktori, os.path.dirname(__file__)
juga bisa rumit. Paling tidak di sistem saya, itu mengembalikan string kosong jika Anda memanggilnya dari direktori yang sama dengan file. ex.
# foo.py
import os
print '__file__ is:', __file__
print 'os.path.dirname(__file__) is:', os.path.dirname(__file__)
akan menampilkan:
__file__ is: foo.py
os.path.dirname(__file__) is:
Dengan kata lain, ini mengembalikan string kosong, jadi ini sepertinya tidak dapat diandalkan jika Anda ingin menggunakannya untuk file saat ini (sebagai lawan dari file modul yang diimpor). Untuk menyiasatinya, Anda dapat membungkusnya dalam panggilan ke abspath:
# foo.py
import os
print 'os.path.abspath(__file__) is:', os.path.abspath(__file__)
print 'os.path.dirname(os.path.abspath(__file__)) is:', os.path.dirname(os.path.abspath(__file__))
yang menghasilkan sesuatu seperti:
os.path.abspath(__file__) is: /home/user/bar/foo.py
os.path.dirname(os.path.abspath(__file__)) is: /home/user/bar
Perhatikan bahwa abspath () TIDAK menyelesaikan symlink. Jika Anda ingin melakukan ini, gunakan realpath () sebagai gantinya. Misalnya, membuat symlink file_import_testing_link mengarah ke file_import_testing.py, dengan konten berikut:
import os
print 'abspath(__file__)',os.path.abspath(__file__)
print 'realpath(__file__)',os.path.realpath(__file__)
mengeksekusi akan mencetak path absolut seperti:
abspath(__file__) /home/user/file_test_link
realpath(__file__) /home/user/file_test.py
file_import_testing_link -> file_import_testing.py
Menggunakan memeriksa
@SummerBreeze menyebutkan menggunakan memeriksa modul.
Ini tampaknya bekerja dengan baik, dan cukup ringkas, untuk modul yang diimpor:
import os
import inspect
print 'inspect.getfile(os) is:', inspect.getfile(os)
dengan patuh mengembalikan jalur absolut. Namun untuk menemukan jalur skrip yang sedang dijalankan, saya tidak melihat cara untuk menggunakannya.