Pyinstaller onefile找不到数据文件

use*_*434 4 python executable exe 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 )
Run Code Online (Sandbox Code Playgroud)

Sér*_*hin 5

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

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

1. 调整路径

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

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

代码将是:

import sys
wd = sys._MEIPASS
file_path = os.path.join(wd,<your>,<file>,<is>,<here>)
Run Code Online (Sandbox Code Playgroud)

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

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

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

根据此处的PyInstaller 文档,有两种方法可以将数据文件添加到捆绑包中:

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

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

然后PyInstall <yourscript.spec>根据您的规格文件运行以构建捆绑包。