python - 如何让 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 )
解决方案
更新的答案
我想改变你的原始代码
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")
使用home
in 二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.exe
在dist
文件夹中运行,捆绑的应用程序将a.txt
在dist
文件夹中查找。
推荐阅读
- c# - 带有时态表的 Entity Framework Core 3.1 - 访问 SysStartTime 和 SysEndTime
- ruby - 为什么我的 ruby 脚本中出现无限循环?
- java - 如何将缓存添加到不透明令牌自省
- python - 无法在百灵解析器python中一次解析多个语句
- sql - Sql 为具有特定模式的组分配唯一键
- javascript - 数字数组和一个数字 k,返回数组中的任意两个数字加起来是否为 k
- javascript - 为什么生产上的 mongodb 使用本地计算机连接?
- swift - 无法通过调试器查看传递的 SwiftUI 参数值
- reactjs - 当单击按钮作为 React 中的组件时,如何在按钮内添加活动加载器?
- r - 使用 tidyverse 中的“recode()”将一系列值重新编码为一个数字