2009-02-27 64 views
248

Duplicate:
In Python, how do I get the path and name of the file that is currently executing?Làm cách nào để có được đường dẫn của tập lệnh Python mà tôi đang chạy?

Làm cách nào để có được đường dẫn của tập lệnh Python mà tôi đang chạy? Tôi đã làm dirname(sys.argv[0]), tuy nhiên trên Mac tôi chỉ nhận được tên tập tin - không phải là con đường đầy đủ như tôi làm trên Windows.

Bất kể ứng dụng của tôi được khởi chạy từ đâu, tôi muốn mở các tệp có liên quan đến (các) tệp script của tôi.

+14

Có vẻ như Jeff quên rằng không phải tất cả các tập lệnh python đều là các mô-đun, vui lòng chỉ định để mở lại. – sorin

+0

@sorin oh, nhưng chúng là; một đối tượng 'module' có thể được tạo cho bất kỳ tập tin kịch bản nào. Chỉ vì một cái gì đó không bao giờ thực sự được 'import'ed không làm cho nó" không phải là một mô-đun ". Câu trả lời là như nhau, anyway: xử lý kịch bản như một mô-đun (sử dụng một số loại bootstrap nếu thực sự cần thiết) và sau đó áp dụng cùng một kỹ thuật. –

+6

Có, tập lệnh là một mô-đun, nhưng câu hỏi được hỏi kỹ này sẽ được mở lại. Nó chưa được trả lời ở đây, và câu hỏi "trùng lặp" không phải là một bản sao vì nó chỉ trả lời làm thế nào để có được vị trí của một mô-đun bạn đã tải, không phải là mô-đun bạn đang ở. –

Trả lời

48
import os 
print os.path.abspath(__file__) 
+0

Cảm ơn. Điều này có được đường dẫn của tập tin .py nơi mã được viết, đó là những gì tôi muốn, mặc dù OP muốn một con đường khác. – OdraEncoded

71

7.2 của Dive Into Python: Finding the Path.

import sys, os 

print('sys.argv[0] =', sys.argv[0])    
pathname = os.path.dirname(sys.argv[0])   
print('path =', pathname) 
print('full path =', os.path.abspath(pathname)) 
+1

Tôi thích cách câu trả lời của bạn cho thấy nhiều biến thể và tính năng khác nhau từ python để giải quyết câu hỏi. –

+0

Có, và tôi thích nó hơn vì nó không sử dụng biến '__' (tôi biết nó chỉ là quy ước cho tên hệ thống) – Davide

+65

** này không hoạt động ** nếu bạn gọi tập lệnh qua tập lệnh khác từ thư mục khác. – sorin

-3

Nếu bạn có ngay cả những tên đường dẫn tương đối (trong trường hợp này nó dường như là ./), bạn có thể mở các file liên quan đến tập tin kịch bản của bạn (s). Tôi sử dụng Perl, nhưng cùng một giải pháp chung có thể áp dụng: Tôi chia thư mục thành một mảng các thư mục, sau đó cắt pop phần tử cuối cùng (tập lệnh), sau đó push (hoặc cho bạn, append) trên bất kỳ thứ gì tôi muốn và sau đó tham gia họ lại với nhau, và BAM! Tôi có một tên đường dẫn làm việc trỏ đến chính xác nơi tôi mong đợi nó trỏ, tương đối hoặc tuyệt đối.

Tất nhiên, có các giải pháp tốt hơn, như được đăng. Tôi chỉ giống như tôi.

+3

Trong python này không hoạt động nếu bạn gọi kịch bản từ một đường dẫn hoàn toàn khác, ví dụ: nếu bạn đang ở trong '~' và tập lệnh của bạn nằm trong '/ some-path/script' bạn sẽ nhận được'./'bằng' ~ 'và không phải'/some-path' như anh ta đã hỏi (và tôi cũng cần) – Davide

+2

câu hỏi là làm thế nào để có được đường dẫn của mô-đun, không phải làm thế nào để xây dựng một tên đường dẫn từ một –

+0

Nhìn vào bạn bây giờ Chris! Nhìn vào bạn ngay bây giờ! – zelusp

321

os.path.realpath(__file__) sẽ cung cấp cho bạn đường dẫn của tệp hiện tại, giải quyết mọi liên kết tượng trưng trong đường dẫn. Điều này hoạt động tốt trên mac của tôi.

+9

Không chắc chắn về điều đó, đây là kết quả từ OSX 10.6 'NameError: tên chung '__file__' không được xác định' – sorin

+9

Sorin: Có lẽ bạn đã thử biểu thức trong shell? –

+3

Tôi nhận được như vậy và sử dụng nó trong một chương trình không có trong trình bao. Tệp "C: \ Python27 \ pydocs \ cli_mate new \ chimpbot.py", dòng 15, trong __init__ self.current_dict = os.path.realpath (__ file __) + '\ data \ default_dict.dat' NameError: tên chung '__file__' không được xác định –

31

Giải pháp được chấp nhận cho điều này sẽ không hoạt động nếu bạn định biên dịch tập lệnh bằng py2exe. Nếu bạn định làm như vậy, đây là chức năng tương đương:

os.path.dirname(sys.argv[0]) 

Py2exe không cung cấp biến số __file__. Để tham khảo: http://www.py2exe.org/index.cgi/Py2exeEnvironment

+2

Thật không may điều này không hoạt động trên Mac, như OP nói. Vui lòng xem [sys.argv] (http://docs.python.org/library/sys.html#sys.argv): _it là hệ điều hành phụ thuộc cho dù đây là một tên đường dẫn đầy đủ hay không_ – Stefano

+0

(nó vô cùng phức tạp để có được một thực sự là giải pháp đa trình duyệt ...) – Stefano

+6

@Stefano ** đó không phải là vấn đề **. Để đảm bảo đó là một tên đường dẫn tuyệt đối (đầy đủ), sử dụng 'os.path.abspath (...)' –

Các vấn đề liên quan