python - Pyinstaller onefile找不到数据文件

标签 python exe executable pyinstaller

我也第一次尝试构建一个简单的 --onefile exe,其中包含数据文件,但 Pyinstaller 在构建 .exe 时似乎没有找到它们。 --onedir 构建似乎工作正常。

此时我也在使用 --debug 开关。我能够运行 onefile 可执行文件,并且可以看到它似乎开始工作。该程序可以正常找到 (sys._MEIPASS) 临时目录(按照指示打印所需的目录名称),但在从临时目录查找第一个数据文件时报告“没有此类文件或目录”错误。我在 .exe 上使用 archiveviewer.py 并没有在那里找到所需的数据文件 - 这似乎是问题所在,但我不明白为什么。构建的数据文件位于规范文件描述的目录中。我的完整规范文件是

# -*- mode: python -*-

a = Analysis(['develop6.py'],
         pathex=['C:\\PYINST20'],
         hiddenimports=[],
         hookspath=None)

a.datas += [ ('conlist.txt', 'C:\\pyinst20\\conlist.txt', 'DATA'), ('imageblank.gif', 'C:\\pyinst20\\imageblank.gif', 'DATA')]

pyz = PYZ(a.pure)

exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name=os.path.join('dist', 'develop6.exe'),
      debug=True,
      strip=None,
      upx=True,
      console=True )

最佳答案

(这个问题很旧,但它是我发现解决同一问题的唯一来源之一,我将在这里分享我的解决方案,以防它可以帮助某人)

要在 --onefile 模式下将数据文件添加到脚本中,需要做两件主要的事情。

1。调整路径

在脚本中,调整路径以查找包中的数据文件。 根据 PyInstaller 文档 here ,可执行文件是从临时文件启动的,因此您的路径必须处理此动态部分:

对于具有以下相对路径的文件: ./your/file/is/here.ext

代码为:

import sys
wd = sys._MEIPASS
file_path = os.path.join(wd,<your>,<file>,<is>,<here>)

注意:要使您的代码也适用于其他上下文,您可以执行以下操作:

import sys
import os
try:
   wd = sys._MEIPASS
except AttributeError:
   wd = os.getcwd()
file_path = os.path.join(wd,<your>,<file>,<is>,<here>)

2。在 PyInstaller 规范中添加数据文件路径

根据 PyInstaller 文档 here ,有两种方法可以将数据文件添加到 bundle 中:

  1. 传递选项 --add-files以及运行时的文件作为参数pyinstaller <yourscript.py>从您的脚本目录

  2. 首先通过导航到脚本目录并运行 pyi-makespec <yourscript.py> 来生成规范文件。 ,然后将您的文件添加到元组列表 data=[] 。 元组包含文件的实际路径以及其中的路径 你的包裹。如果您遵循第一点,这应该看起来像 datas = [('/your/file/is/here.ext','/your/file/is/')]

然后运行PyInstall <yourscript.spec>根据您的规范文件构建 bundle 。

关于python - Pyinstaller onefile找不到数据文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14296833/

相关文章:

c++ - Visual Studio C++ 控制台应用程序生成并运行但不创建 EXE 文件

perl - 在 Perl 中执行进程,使用 IPC 停止、恢复、终止选项

python - py2exe 似乎缺少以下模块

linux - readelf 报告 so file as NEEDED,但没有使用它的函数(或其他符号)

windows - 如何创建可执行的命令提示符脚本

python - 如何在 python 中优化它?

Python 无法捕获重写的 NameError

Python 多处理脚本在运行数小时后死掉

python - 单击图标将运行或安装我的 python Tkinter 桌面应用程序,该应用程序也可用于任何 PC

python - 通过python API获取Windows Azure存储表名称