使用 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 文件?

Pyinstaller --onefile 模式,如何在解包前向控制台写入消息

Filecoin推出稳定币oneFIL