关于python:如何获取执行冻结脚本的路径

How to Get the Path of the executing frozen script

如果您从一个目录运行一个冻结的python脚本(使用py2exe冻结),并且该脚本所在的驱动器与该脚本所在的驱动器不同,那么确定执行脚本的路径的最佳方法是什么?

我尝试过的解决方案很少

1
inspect.getfile(inspect.currentframe())

问题:不返回完整路径。它只返回脚本名。

1
os.path.abspath( __file__ )

问题:无法在Windows上工作

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

问题:返回空字符串。

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

如果驱动器与PWD不同,将不工作

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

如果驱动器与PWD不同,将不工作

下面是一个最小的不起作用的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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

相关问题:

  • 如何知道在python中运行脚本的路径?
  • 如何获取当前正在执行的文件的路径和名称?
  • python,脚本路径[关闭]

注释

@如果脚本驻留在您正在执行的同一个驱动器上,那么Fenikso的解决方案将起作用,但是当它位于不同的驱动器上时,它将不起作用。


另一种方法在从另一个驱动器运行时(即使使用路径),也可以使用cxfreeze:

1
2
3
4
5
6
import sys

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

从Python:

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

从命令行:

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

使用路径:

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


imho,与绝对路径不同的代码不是一个好的解决方案。相对路径解决方案可能更好。使用dirname了解相关目录,使用os.sep实现跨平台兼容性。

1
2
3
4
5
6
7
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


试试这个:

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

这就是我使用cx_freeze从.exe真正运行的目录中获取的内容。