使用 onefile 选项在 Pyinstaller 中添加数据文件

新手上路,请多包涵

我正在尝试将图像添加到 Pyinstaller 生成的一个文件中。我已经阅读了很多问题/论坛,例如 这个 和那个 但仍然无法正常工作。

我知道对于一个文件操作,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

原文由 AhmedWas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
1 个回答

当使用 PyInstaller 打包到单个文件时,运行 .exe 会将所有内容解压到 TEMP 目录中的文件夹中,运行脚本,然后丢弃临时文件。临时文件夹的路径随着每次运行而变化,但对其位置的引用被添加到 sys 作为 sys._MEIPASS

要使用它,当您的 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,可以打开和读取打包的数据文件。

原文由 James 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题