首页 > 解决方案 > 如何让 pyinstaller 查看基于主目录的配置文件?

问题描述

TLDR

为了让我的问题更清楚一点,我不想将配置文件与 pyinstaller 捆绑在一起。这是因为如果它不存在,应用程序将创建它。我想要做的是让 pyinstaller 编译二进制文件来读取配置文件(如果它已经存在)。

我正在尝试在一个小项目上使用 pyinstaller,该项目使用基于 configparser 的 ini 文件来加载某些变量。当我的项目使用 pip 安装并首次运行时,它将查找并且如果不存在,则在主目录中创建必要的配置文件。这适用于 windows、osx 和 linux。

我遇到的问题是,当我使用 pyinstaller 编译项目时,它不会寻找这个。

我的问题是,我如何编译我的项目,以便它在运行时查看配置文件的指定位置?最好带有onefile选项。我的项目在这里

例如,在我的配置文件中,我有一个名为 pluginpath 的配置对象。如果我运行我的 pip 安装项目,则从基于家庭的配置文件中读取插件路径,并打印路径(如果我向其添加了新值)。但是如果我从编译的二进制文件中运行它,那么它会打印None出默认值。

我的规范生成了一个文件规范文件

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['cli.py'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='chepy',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True )

标签: pythonpython-3.xpyinstaller

解决方案


更新的答案

我想改变你的原始代码

home = Path.home()
self.chepy_dir = (
    Path(".chepy").resolve()
    if Path(".chepy").exists()
    else Path(home / ".chepy")
)
self.chepy_conf = Path(self.chepy_dir / "chepy.conf")

这将有效

home = Path.home()
self.chepy_dir = (
    Path(home / ".chepy").resolve()
    if Path(home / ".chepy").exists()
    else Path(home / ".chepy")
)
self.chepy_conf = Path(self.chepy_dir / "chepy.conf")

使用homein 二Path,它会.chepy在用户主目录中查找而不是所在文件夹chepy/chepy/config.py,即chepy/chepy.

原始答案

我认为您正在谈论在运行时读取配置文件。相关pyinstaller文档在这里。运行时信息

您不需要更改spec文件,但需要注意运行时要读取的文件路径以及执行捆绑应用程序的路径

例如,您有一个 example.py:

with open('a.txt') as f:
        print(f.read())

当你编译时,它会读入你执行命令a.txt的文件夹。

之后pyinstaller example.py,文件结构如下所示:

--
 - example.py
 - dist/
   - example/
     - ...
     - example.exe

如果您.\dist\example\example.exe在当前目录中运行,则捆绑的应用程序将a.txt在当前目录中查找。

如果您.\example\example.exedist文件夹中运行,捆绑的应用程序将a.txtdist文件夹中查找。


推荐阅读