2012-04-24 62 views
8

Nếu bạn đang chạy tập lệnh python bị đóng băng (thư mục sử dụng py2exe) từ thư mục và ổ đĩa khác với vị trí của tập lệnh, cách tốt nhất để xác định đường dẫn thực thi kịch bản?Cách lấy Đường dẫn của tập lệnh đông lạnh thực hiện

Rất ít giải pháp tôi đã cố gắng

inspect.getfile(inspect.currentframe()) 

Vấn đề: Không trả về đường dẫn đầy đủ. Nó chỉ trả về tên kịch bản.

os.path.abspath(__file__) 

Vấn đề: Không làm việc trên Windows

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

Vấn đề: Trả về chuỗi rỗng.

os.path.abspath(inspect.getsourcefile(way3)) 

sẽ không hoạt động nếu ổ đĩa khác với pwd

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

sẽ không hoạt động nếu ổ đĩa khác với pwd

Dưới đây là một không tối thiểu làm ví dụ

D:\>path 
PATH=c:\Python27\;c:\Users\abhibhat\Desktop\ToBeRemoved\spam\dist\;c:\gnuwin32\bin 

D:\>cat c:\Users\abhibhat\Desktop\ToBeRemoved\spam\eggs.py 
import os, inspect, sys 
def way1(): 
    return os.path.dirname(sys.argv[0]) 

def way2(): 
    return inspect.getfile(inspect.currentframe()) 

def way3(): 
    return os.path.dirname(os.path.realpath(sys.argv[0])) 

def way4(): 
    try: 
     return os.path.abspath(__file__) 
    except NameError: 
     return "Not Found" 
def way5(): 
    return os.path.abspath(inspect.getsourcefile(way3)) 

if __name__ == '__main__': 
    print "Path to this script is",way1() 
    print "Path to this script is",way2() 
    print "Path to this script is",way3() 
    print "Path to this script is",way4() 
    print "Path to this script is",way5() 

D:\>eggs 
Path to this script is 
Path to this script is eggs.py 
Path to this script is D:\ 
Path to this script is Not Found 

câu hỏi liên quan:

Note

@ giải pháp Fenikso sẽ hoạt động nếu kịch bản nằm trên cùng một ổ đĩa mà bạn đang thực hiện nhưng khi nó trên một ổ đĩa khác nhau, nó sẽ không làm việc

Trả lời

10

Một cách tiếp cận mà làm việc với cxFreeze khi chạy từ ổ đĩa khác thậm chí sử dụng PATH:

import sys 

if hasattr(sys, 'frozen'): 
    print(sys.executable) 
else: 
    print(sys.argv[0]) 

Từ Python:

H:\Python\Examples\cxfreeze\pwdme.py 

Từ dòng lệnh:

D:\>h:\Python\Examples\cxfreeze\dist\pwdme.exe 
h:\Python\Examples\cxfreeze\dist\pwdme.exe 

Sử dụng PATH:

D:\>pwdme.exe 
h:\Python\Examples\cxfreeze\dist\pwdme.exe 
+2

Có, điều này cũng hoạt động với py2exe. –

+0

@Fenikso: Công trình này hoàn hảo. Trước khi đăng câu hỏi này tôi đã thấy vài tham chiếu đến cùng một vấn đề trong SO, nhưng không có câu trả lời nào là không chính xác cho mỗi lần '. – Abhijit

0

Hãy thử điều này:

WD = os.path.dirname(os.path.realpath(sys.argv[0])) 

Đó là những gì tôi sử dụng với cx_Freeze để có được những thư mục từ nơi .exe là thực sự chạy.

+0

này sẽ không hoạt động nếu kịch bản có mặt trong một khác nhau ổ – Abhijit

+0

@Abhijit - Xin lỗi, tôi không hiểu. Đây là phần cơ bản của tất cả các tập lệnh đã được cố định của tôi và nó không bao giờ thất bại. Bạn có thể mô tả một ví dụ khi điều này không thành công? – Fenikso

+0

Tôi đã cập nhật ví dụ để bao gồm kịch bản này. Nếu ổ đĩa khác, nó chỉ trả về tên ổ đĩa từ nơi bạn đang chạy. – Abhijit

2

IMHO, mã hoạt động khác nhau tùy thuộc vào đường dẫn tuyệt đối không phải là giải pháp tốt. Nó có lẽ sẽ là một giải pháp đường dẫn tương đối tốt hơn. Sử dụng dirname để biết thư mục tương đối và os.sep cho khả năng tương thích nền tảng chéo.

if hasattr(sys, "frozen"): 
    main_dir = os.path.dirname(sys.executable) 
    full_real_path = os.path.realpath(sys.executable) 
else: 
    script_dir = os.path.dirname(__file__) 
    main_dir = os.path.dirname(os.path.realpath(sys.argv[0])) 
    full_real_path = os.path.realpath(sys.argv[0]) 

thuộc tính cố định là chuẩn python.

Hãy xem cũng tại Esky: http://pypi.python.org/pypi/esky

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