python - 编译调用配置文件

who*_*rth 2 python pyinstaller python-2.7

我正在使用 pyinstaller 编译 python 应用程序。

结构是这样的——

d:\app\myprog.exe
d:\app\config\settings.conf
Run Code Online (Sandbox Code Playgroud)

如果我myprog.exe --switch valued:\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
Run Code Online (Sandbox Code Playgroud)

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]))
Run Code Online (Sandbox Code Playgroud)

这样我就可以得到这样的配置文件 -

config = RawConfigParser()
config.read(os.path.join(BASE_DIR, 'config/settings.conf'))
Run Code Online (Sandbox Code Playgroud)

但我想BASE_DIR是我运行 EXE 的任何文件夹(例如c:\windows,而不是 EXE 的位置(即d:\app)?

far*_*zad 6

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

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

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

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