我正在使用pyinstaller编译python应用程序。
结构就是这样 -
d:\app\myprog.exe
d:\app\config\settings.conf
如果我从myprog.exe --switch value
运行d:\app
它运行正常,如果我尝试从其他任何地方运行,例如c:\windows
,则找不到我的settings.conf
文件抱怨该消息:
Traceback (most recent call last):
File "<string>", line 284, in <module>
File "<string>", line 218, in main
File "ConfigParser.py", line 330, in get
ConfigParser.NoSectionError: No section: 'database'
myApp returned -1
database
是我试图引用的配置文件中的第一行。
我在这里引用了应用中的BASE_DIR
-
# Global Path and Config Info
try:
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
except NameError: # We are the main py2exe script, not a module
BASE_DIR = os.path.dirname(os.path.abspath(sys.argv[0]))
这样我就可以得到这样的配置文件 -
config = RawConfigParser()
config.read(os.path.join(BASE_DIR, 'config/settings.conf'))
但我猜BASE_DIR
是我正在运行EXE的文件夹(如c:\windows
,而不是EXE的位置(d:\app
)?
答案 0 :(得分:2)
正如PyInstaller documentation(在单文件程序如何工作部分)中提到的,当执行单个可执行文件(由PyInstaller创建)时,会发生什么是目录结构将所需的库模块(Python VM,库和包等)从该单个可执行文件中提取到临时目录,然后从那里启动应用程序。
这意味着Python代码中的__file__
将不会成为单个可执行文件的路径,这就是导致此问题的原因。
我编写应用程序以从命令行参数接受配置文件的路径,回退到使用环境变量(如果可用),然后是基于平台的硬编码默认值(如大多数多平台应用程序那样)达到他们的配置)。
另一种方法是使用PyInstaller的单目录输出,并将配置文件包含在同一目录中。 然后,为了便于将软件分发给最终用户,请使用其他工具从该目录结构创建单个Windows安装程序文件。这样您就可以分发Windows安装程序,以便用户可以运行以安装该应用程序。但是当应用程序运行时,它将从配置文件所在的目录运行。