Tôi chỉ muốn giải quyết một số nhầm lẫn đầu tiên. __file__
không phải là ký tự đại diện, nó là một thuộc tính. Các thuộc tính và phương thức gạch dưới đôi được coi là "đặc biệt" theo quy ước và phục vụ một mục đích đặc biệt.
http://docs.python.org/reference/datamodel.html hiển thị nhiều phương thức và thuộc tính đặc biệt, nếu không phải tất cả chúng.
Trong trường hợp __file__
này là một thuộc tính của một mô-đun (một đối tượng mô-đun). Trong Python một .py
tệp là một mô-đun. Vì vậy, import amodule
sẽ có một thuộc tính __file__
có nghĩa là những thứ khác nhau trong các trường hợp khác nhau.
Lấy từ các tài liệu:
__file__
là tên đường dẫn của tệp mà mô-đun được tải, nếu nó được tải từ một tệp. Các __file__
thuộc tính là không có mặt cho module C được liên kết tĩnh thành người phiên dịch; đối với các mô-đun mở rộng được tải động từ thư viện dùng chung, đó là tên đường dẫn của tệp thư viện dùng chung.
Trong trường hợp của bạn, mô-đun đang truy cập __file__
thuộc tính của chính nó trong không gian tên toàn cục.
Để thấy điều này trong hành động hãy thử:
# file: test.py
print globals()
print __file__
Và chạy:
python test.py
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__':
'test_print__file__.py', '__doc__': None, '__package__': None}
test_print__file__.py
__file__
KHÔNG được xác định trong mọi trường hợp, ví dụ: các mô-đun C được liên kết tĩnh. Chúng tôi không thể tin vào việc__file__
luôn luôn có sẵn.