如何获取执行冻结脚本的path

如果你正在从一个目录运行一个冻结的python脚本(使用py2exe冻结),并且驱动与脚本的位置不同,那么确定执行脚本path的最好方法是什么?

我尝试了几个解决scheme

inspect.getfile(inspect.currentframe()) 

问题:不返回完整path。 它只返回脚本名称。

 os.path.abspath( __file__ ) 

问题:在Windows上不起作用

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

问题:返回空string。

 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 

相关问题:

  • 如何知道Python中运行脚本的path?
  • 我如何获得当前正在执行的文件的path和名称?
  • python,脚本的path[closures]

注意

@ Fenikso的解决scheme将工作,如果脚本驻留在您正在执行相同的驱动器,但是当它在不同的驱动器上,它将无法正常工作

Solutions Collecting From Web of "如何获取执行冻结脚本的path"

另一种方法,即使使用PATH从另一个驱动器运行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 

恕我直言,根据绝对路径行事的代码不是一个好的解决方案。 相对路径解决方案可能会更好。 使用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

尝试这个:

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

这就是我使用cx_Freeze获取.exe实际运行的目录。