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真正运行的目录中获取的内容。