2012-04-24 97 views
8

如果您正在從目錄和驅動器運行與腳本存在位置不同的凍結python腳本(使用py2exe凍結),那麼確定路徑的最佳方法是什麼執行腳本?如何獲取正在執行的凍結腳本的路徑

幾個解決方案我已經試過

inspect.getfile(inspect.currentframe()) 

問題:不返回完整路徑。它只返回腳本名稱。

os.path.abspath(__file__) 

問題:不能在Windows

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

問題的工作:返回空字符串。

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

不會,如果驅動器是從PWD不同的工作

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

如果驅動器是從PWD

這裏不同都不行是一個很小的不工作示例

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 

相關問題:如果腳本駐留在

注意

@ Fenikso的解決方案將工作同樣的車程,那裏正在執行,但是當它是一個不同的驅動器上,它不會工作

回答

10

另一種方法,甚至使用路徑從其它驅動器上運行時與cxFreeze工作:

import sys 

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

通過Python:

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

從命令行:

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

使用PATH:

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

是的,這也適用於py2exe。 – 2012-04-24 08:50:54

+0

@Fenikso:這很好。在發佈這個問題之前,我已經看到很少提及SO中的同一個問題,但是沒有一個答案本身是不正確的。 – Abhijit 2012-04-24 09:01:15

0

試試這個:

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

這就是我與cx_Freeze用於獲取從哪裏.exe文件所在的目錄真的在跑。

+0

如果腳本存在於不同的驅動器 – Abhijit 2012-04-24 08:00:22

+0

@Abhijit這是行不通的 - 對不起,我不明白。這是我所有凍結腳本的基本部分,它從未失敗。你能描述一個例子嗎? – Fenikso 2012-04-24 08:02:37

+0

我已更新示例以包含此場景。如果驅動器不同,它只是從您正在運行的位置返回驅動器名稱。 – Abhijit 2012-04-24 08:06:36

2

恕我直言,根據絕對路徑採取不同行爲的代碼不是一個好的解決方案。 它可能會更好的相對路徑解決方案。使用dirname知道相對目錄和os.sep的跨平臺兼容性。

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]) 

凍結屬性是python標準。

看看還在ESKY: http://pypi.python.org/pypi/esky

相關問題