确定由pyInstaller生成的Python EXE中的应用程序path

我有一个应用程序驻留在一个.py文件中。 我已经能够让pyInstaller成功地将它捆绑到Windows的EXE中。 问题是,应用程序需要一个.cfg文件,该文件始终直接位于同一目录中的应用程序旁边。

通常,我使用以下代码构buildpath:

import os config_name = 'myapp.cfg' config_path = os.path.join(sys.path[0], config_name) 

但是,从pyInstaller生成的EXE调用时,sys.path似乎是空白的。 当您运行python交互式命令行并尝试获取sys.path [0]时,会发生相同的行为。

是否有一个更具体的方式获取当前正在运行的应用程序的path,以便我可以find相对于它的文件?

我find了解决scheme。 您需要检查应用程序是以脚本还是以冻结的exe运行:

 import os import sys config_name = 'myapp.cfg' # determine if application is a script file or frozen exe if getattr(sys, 'frozen', False): application_path = os.path.dirname(sys.executable) elif __file__: application_path = os.path.dirname(__file__) config_path = os.path.join(application_path, config_name) 

根据pyInstaller的文档 ,build议的恢复应用程序path的方法如下:

 #!/usr/bin/python3 import sys, os if getattr(sys, 'frozen', False): # If the application is run as a bundle, the pyInstaller bootloader # extends the sys module by a flag frozen=True and sets the app # path into variable _MEIPASS'. application_path = sys._MEIPASS else: application_path = os.path.dirname(os.path.abspath(__file__)) 

testingpyInstaller v3.2,但这当然也一直在早期版本的工作。

Soviut的解决scheme不起作用,至less在pyInstaller的最新版本中并不普遍(请注意,OP已经有很多年了)。 例如,在MacOS上,将应用程序绑定到一个文件包时, sys.executable只能指向embedded式归档的位置,而不是在pyInstaller引导加载程序创build临时应用程序之后应用程序实际运行的位置环境。 只有sys._MEIPASS正确指向那个位置。 有关pyInstaller如何工作的更多信息,请参阅此文档页面 。

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

这对我行得通。