2012-02-14 40 views
56
A = os.path.join(os.path.dirname(__file__), '..') 

B = os.path.dirname(os.path.realpath(__file__)) 

C = os.path.abspath(os.path.dirname(__file__)) 

Tôi thường chỉ cứng những cái này với đường dẫn thực tế. Nhưng có một lý do cho những phát biểu này xác định đường dẫn trong thời gian chạy, và tôi thực sự thích understant mô-đun os.path để tôi có thể bắt đầu sử dụng nó.biến __file__ có nghĩa là gì/làm gì?

+5

Rõ ràng, nó không phải là một ký tự đại diện. – tripleee

+3

Biến "ma thuật" của nó; ký tự đại diện có nghĩa là một cái gì đó khá khác nhau. –

Trả lời

66

Khi mô-đun được tải bằng Python, __file__ được đặt thành tên của nó. Sau đó bạn có thể sử dụng với các chức năng khác để tìm thư mục mà tập tin nằm ở

Lấy ví dụ của bạn cùng một lúc.

A = os.path.join(os.path.dirname(__file__), '..') 
# A is the parent directory of the directory where program resides. 

B = os.path.dirname(os.path.realpath(__file__)) 
# B is the canonicalised (?) directory where the program resides. 

C = os.path.abspath(os.path.dirname(__file__)) 
# C is the absolute path of the directory where the program resides. 

Bạn có thể thấy các giá trị khác nhau trở về từ những ở đây:

import os 
print __file__ 
print os.path.join(os.path.dirname(__file__), '..') 
print os.path.dirname(os.path.realpath(__file__)) 
print os.path.abspath(os.path.dirname(__file__)) 

và đảm bảo bạn chạy từ các vị trí khác nhau (chẳng hạn như ./text.py, ~/python/text.py và vv) để xem sự khác biệt nào tạo ra.

+3

Câu trả lời hay, nhưng xem chi tiết quan trọng khác từ các câu trả lời khác: '__file__' KHÔNG được định nghĩa trong mọi trường hợp, ví dụ: mô-đun C được liên kết tĩnh. Chúng tôi không thể đếm trên '__file__' luôn có sẵn. –

+2

Trong thông dịch viên, tất cả các ví dụ trả về 'tên '__file__' không được định nghĩa'. – user1063287

+2

@ user1063287 Xem câu trả lời của DemoUser; '__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. Điều này có nghĩa là '__file__' sẽ chỉ hoạt động khi bạn chạy nó như một kịch bản không có trong trình thông dịch. (Trừ khi bạn nhập nó vào trình thông dịch ...) – YOUNG

10

mỗi sự documentation:

__file__ là tên đường dẫn của tập tin mà từ đó các mô-đun là nạp, nếu nó đã được nạp từ một tập tin. Thuộc tính __file__ không phải là hiện diện cho các mô-đun C được liên kết tĩnh vào trình thông dịch; cho các mô-đun mở rộng được tải động từ thư viện được chia sẻ, nó là tên đường dẫn của tệp thư viện được chia sẻ.

also:

__file__ là trở thành “con đường” đến tập tin trừ khi các mô-đun được xây dựng-in (và do đó được liệt kê trong sys.builtin_module_names) trong trường hợp này thuộc tính không được thiết lập.

8

Sử dụng __file__ kết hợp với các mô-đun os.path khác nhau cho phép tất cả các đường dẫn tương đối với vị trí thư mục của mô-đun hiện tại. Điều này cho phép các mô-đun/dự án của bạn có thể di chuyển sang các máy khác.

Trong dự án của bạn, bạn cần làm:

A = '/Users/myname/Projects/mydevproject/somefile.txt' 

và sau đó cố gắng để triển khai nó đến máy chủ của bạn với một thư mục triển khai như /home/web/mydevproject/ sau đó mã của bạn sẽ không thể tìm ra con đường đúng.

30

Tôi chỉ muốn giải quyết một số nhầm lẫn trước tiên. __file__ không phải là ký tự đại diện mà là thuộc tính. Các thuộc tính và phương thức gạch dưới kép đượ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 pháp và thuộc tính đặc biệt, nếu không phải tất cả chúng.

Trong trường hợp này __file__ là thuộc tính của mô-đun (đối tượng mô-đun). Trong Python, tệp .py là một mô-đun. Vì vậy, import amodule sẽ có một thuộc tính là __file__ có nghĩa là những thứ khác nhau trong các trường hợp khác nhau.

Taken từ các tài liệu:

__file__ là tên đường dẫn của tập tin mà từ đó các mô-đun đã được nạp, nếu nó đã được nạp từ một tập tin. Thuộc tính __file__ không có mặt cho các mô-đun C được liên kết tĩnh vào trình thông dịch; cho mô-đun tiện ích được tải động từ thư viện được chia sẻ, đó là tên đường dẫn của tệp thư viện được chia sẻ.

Trong trường hợp của bạn, mô-đun đang truy cập thuộc tính riêng của nó trong không gian tên chung.

Để thấy điều này trong hành động 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