python - 编译调用配置文件

时间:2016-04-19 02:37:25

标签: python python-2.7 pyinstaller

我正在使用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)?

1 个答案:

答案 0 :(得分:2)

正如PyInstaller documentation(在单文件程序如何工作部分)中提到的,当执行单个可执行文件(由PyInstaller创建)时,会发生什么是目录结构将所需的库模块(Python VM,库和包等)从该单个可执行文件中提取到临时目录,然后从那里启动应用程序。

这意味着Python代码中的__file__将不会成为单个可执行文件的路径,这就是导致此问题的原因。

我编写应用程序以从命令行参数接受配置文件的路径,回退到使用环境变量(如果可用),然后是基于平台的硬编码默认值(如大多数多平台应用程序那样)达到他们的配置)。

另一种方法是使用PyInstaller的单目录输出,并将配置文件包含在同一目录中。 然后,为了便于将软件分发给最终用户,请使用其他工具从该目录结构创建单个Windows安装程序文件。这样您就可以分发Windows安装程序,以便用户可以运行以安装该应用程序。但是当应用程序运行时,它将从配置文件所在的目录运行。