Cập nhật 2018-11-28:
Dưới đây là tóm tắt các thử nghiệm với Python 2 và 3. Với
main.py - chạy foo.py
foo.py - chạy lib / bar.py
lib / bar.py - in biểu thức filepath
| Python | Run statement | Filepath expression |
|--------+---------------------+----------------------------------------|
| 2 | execfile | os.path.abspath(inspect.stack()[0][1]) |
| 2 | from lib import bar | __file__ |
| 3 | exec | (wasn't able to obtain it) |
| 3 | import lib.bar | __file__ |
Đối với Python 2, việc chuyển sang các gói có thể rõ ràng hơn from lib import bar
- chỉ cần thêm __init__.py
các tệp trống vào hai thư mục.
Đối với Python 3, execfile
không tồn tại - thay thế gần nhất là exec(open(<filename>).read())
, mặc dù điều này ảnh hưởng đến các khung ngăn xếp. Đơn giản nhất là chỉ sử dụng import foo
và import lib.bar
- không __init__.py
cần tệp.
Xem thêm Sự khác biệt giữa nhập và thực thi
Câu trả lời gốc:
Đây là một thử nghiệm dựa trên các câu trả lời trong chuỗi này - với Python 2.7.10 trên Windows.
Những người dựa trên ngăn xếp là những người duy nhất dường như cho kết quả đáng tin cậy. Hai cái cuối cùng có cú pháp ngắn nhất , tức là -
print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib
Đây là những thứ được thêm vào sys dưới dạng hàm! Tín dụng cho @Usagi và @pablog
Dựa trên ba tệp sau đây và chạy main.txt từ thư mục của nó với python main.py
(cũng đã thử các tệp thực thi với các đường dẫn tuyệt đối và gọi từ một thư mục riêng).
C: \ filepaths \ main.py: execfile('foo.py')
C: \ filepaths \ foo.py: execfile('lib/bar.py')
C: \ filepaths \ lib \ bar.py:
import sys
import os
import inspect
print "Python " + sys.version
print
print __file__ # main.py
print sys.argv[0] # main.py
print inspect.stack()[0][1] # lib/bar.py
print sys.path[0] # C:\filepaths
print
print os.path.realpath(__file__) # C:\filepaths\main.py
print os.path.abspath(__file__) # C:\filepaths\main.py
print os.path.basename(__file__) # main.py
print os.path.basename(os.path.realpath(sys.argv[0])) # main.py
print
print sys.path[0] # C:\filepaths
print os.path.abspath(os.path.split(sys.argv[0])[0]) # C:\filepaths
print os.path.dirname(os.path.abspath(__file__)) # C:\filepaths
print os.path.dirname(os.path.realpath(sys.argv[0])) # C:\filepaths
print os.path.dirname(__file__) # (empty string)
print
print inspect.getfile(inspect.currentframe()) # lib/bar.py
print os.path.abspath(inspect.getfile(inspect.currentframe())) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # C:\filepaths\lib
print
print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib
print
__file__
tuyệt đối hay tương đối?