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 .pytệp là một mô-đun. Vì vậy, import amodulesẽ 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.