Tôi cũng sẽ cố gắng giải quyết một vài biến thể cho câu hỏi này:
- tìm đường dẫn của tập lệnh được gọi
- tìm đường dẫn của tập lệnh hiện đang thực thi
- tìm thư mục của tập lệnh được gọi
(Một số câu hỏi này đã được hỏi về SO, nhưng đã bị đóng dưới dạng trùng lặp và được chuyển hướng ở đây.)
Hãy cẩn thận khi sử dụng __file__
Đối với một mô-đun mà bạn đã nhập:
import something
something.__file__
sẽ trả về đường dẫn tuyệt đối của mô-đun. Tuy nhiên, được cung cấp tập lệnh folowing foo.py:
#foo.py
print '__file__', __file__
Gọi nó bằng 'python foo.py' Sẽ trả lại đơn giản là 'foo.py'. Nếu bạn thêm một shebang:
#!/usr/bin/python
#foo.py
print '__file__', __file__
và gọi nó bằng cách sử dụng ./foo.py, nó sẽ trả về './foo.py'. Gọi nó từ một thư mục khác, (ví dụ: đặt foo.py vào thanh thư mục), sau đó gọi một trong hai
python bar/foo.py
hoặc thêm một shebang và thực hiện trực tiếp tệp:
bar/foo.py
sẽ trả về 'bar / foo.py' ( đường dẫn tương đối ).
Tìm thư mục
Bây giờ đi từ đó để có được thư mục, os.path.dirname(__file__)
cũng có thể là khó khăn. Ít nhất trên hệ thống của tôi, nó trả về một chuỗi trống nếu bạn gọi nó từ cùng thư mục với tệp. Ví dụ.
# foo.py
import os
print '__file__ is:', __file__
print 'os.path.dirname(__file__) is:', os.path.dirname(__file__)
sẽ xuất ra:
__file__ is: foo.py
os.path.dirname(__file__) is:
Nói cách khác, nó trả về một chuỗi rỗng, vì vậy điều này có vẻ không đáng tin nếu bạn muốn sử dụng nó cho tệp hiện tại (trái ngược với tệp của mô-đun đã nhập). Để giải quyết vấn đề này, bạn có thể gói nó trong một cuộc gọi để từ chối:
# 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__))
mà xuất ra một cái gì đó như:
os.path.abspath(__file__) is: /home/user/bar/foo.py
os.path.dirname(os.path.abspath(__file__)) is: /home/user/bar
Lưu ý rằng abspath () KHÔNG giải quyết các liên kết tượng trưng. Nếu bạn muốn làm điều này, sử dụng realpath () thay thế. Ví dụ: tạo một symlink file_import_testing_link trỏ đến file_import_testing.py, với nội dung sau:
import os
print 'abspath(__file__)',os.path.abspath(__file__)
print 'realpath(__file__)',os.path.realpath(__file__)
thực thi sẽ in các đường dẫn tuyệt đối giống như:
abspath(__file__) /home/user/file_test_link
realpath(__file__) /home/user/file_test.py
file_import_testing_link -> file_import_testing.py
Sử dụng kiểm tra
@SummerBreeze đề cập đến việc sử dụng mô-đun kiểm tra .
Điều này dường như hoạt động tốt và khá ngắn gọn, cho các mô-đun nhập khẩu:
import os
import inspect
print 'inspect.getfile(os) is:', inspect.getfile(os)
ngoan ngoãn trả lại con đường tuyệt đối. Tuy nhiên, để tìm đường dẫn của tập lệnh hiện đang thực thi, tôi không thấy cách nào để sử dụng tập lệnh này.