使用 onefile 选项在 Pyinstaller 中添加数据文件
Posted
技术标签:
【中文标题】使用 onefile 选项在 Pyinstaller 中添加数据文件【英文标题】:Adding a data file in Pyinstaller using the onefile option 【发布时间】:2018-12-06 05:42:47 【问题描述】:我正在尝试将图像添加到 Pyinstaller 生成的一个文件中。我已经阅读了很多类似 one 和 one 的问题/论坛,但仍然无法正常工作。
我知道对于一个文件操作,Pyinstller 会生成一个临时文件夹,sys.MEIPASS
可以访问该文件夹。但是我不知道我应该在我的脚本中的哪个位置添加这个sys.MEIPASS
。
请出示以下内容:
1- 在哪里以及如何应该添加sys.MEIPASS
?在 python 脚本中,还是在 spec 文件中?
2- 使用的确切命令是什么?我试过了
pyinstaller --onefile --windowed --add-data="myImag.png;imag" myScript.py
或
pyinstaller --onefile --windowed myScript.py
然后将 ('myImag.png','imag') 添加到 spec 文件中然后运行
pyinstller myScript.spec
没有一个有效。
注意:我在 windows 7 下有 python 3.6
【问题讨论】:
我认为--add-data 是对的,而不是--add-date。 当然,只是输入错误。但是当我执行时我做对了。不过谢谢 【参考方案1】:使用 PyInstaller 打包到单个文件时,运行 .exe 会将所有内容解压缩到 TEMP 目录中的文件夹,运行脚本,然后丢弃临时文件。临时文件夹的路径会随着每次运行而改变,但对其位置的引用会以sys._MEIPASS
的形式添加到sys
。
为了利用这一点,当您的 Python 代码读取任何也将打包到您的 .exe 中的文件时,您需要将文件位置更改为位于 sys._MEIPASS
下。换句话说,你需要将它添加到你的 python 代码中。
这是一个示例,当打包到单个文件时,使用您引用的链接中的代码将文件路径调整为正确的位置。
示例
# data_files/data.txt
hello
world
# myScript.py
import sys
import os
def resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
def print_file(file_path):
file_path = resource_path(file_path)
with open(file_path) as fp:
for line in fp:
print(line)
if __name__ == '__main__':
print_file('data_files/data.txt')
使用以下选项运行 PyInstaller 会打包文件:
pyinstaller --onefile --add-data="data_files/data.txt;data_files" myScript.py
构建myScript.exe,它运行正常,可以打开和读取打包的数据文件。
【讨论】:
非常感谢您!想知道如何用我的 pyinstaller 打包数据文件。 非常感谢您提供了一个最小的示例!注意';'分隔符仅适用于 Windows。对于 Linux 和 Mac,它是 ':',如下所述:***.com/a/59710336/3684641【参考方案2】:我使用命令提示符命令而不是 .spec
该命令将形状排除,然后将其重新添加(我猜这会调用不同的导入过程)。这显示了如何添加文件夹而不仅仅是文件。
pyinstaller --clean --win-private-assemblies --onefile --exclude-module shapely --add-data C:\\Python27\\Lib\\site-packages\\shapely;.\\shapely --add-data C:\\Python27\\tcl\\tkdnd2.8;tcl main.py
【讨论】:
【参考方案3】:我尝试更改了我的 python 脚本的工作目录,它似乎可以工作:
import os
import sys
os.chdir(sys._MEIPASS)
os.system('included\\text.txt')
我的 pyinstaller 命令:
pyinstaller --onefile --nowindow --add-data text.txt;included winprint.py --distpath .
【讨论】:
【参考方案4】:通过以下方式访问临时文件夹的更简单方法:
bundle_dir = getattr(sys, '_MEIPASS', path.abspath(path.dirname(__file__)))
data_path = os.path.abspath(path.join(bundle_dir, 'data_file.dat'))
通过阅读文档得到它
【讨论】:
以上是关于使用 onefile 选项在 Pyinstaller 中添加数据文件的主要内容,如果未能解决你的问题,请参考以下文章
python的pip安装pyinstalle时出现红色代码,安装错误,怎么办?
使用 PyInstaller (--onefile) 捆绑数据文件
使用 PyInstaller 在 --onefile 中使用 QML 构建 PyQt5
在使用 PyInstaller --onefile 打包 kivy 时包含 .kv/.json 文件?