Pyinstaller:图像无法提取

时间:2017-02-10 17:07:25

标签: python pyinstaller

我运行build命令,所有内容似乎都正确构建,直到我尝试启动exe并弹出此消息:

Image

这是我的spec文件,我不确定为什么它似乎是用两个图像梳理文件路径。

block_cipher = None

a = Analysis(['TripCalc.py'],
         pathex=['C:\\Users\\test\\Downloads\\TripApp'],
         binaries=[],
         datas=[('C:\\Users\\test\\Downloads\\TripApp\\BennySM.ico', 'C:\\Users\\test\\Downloads\\TripApp\\BgSM.gif')],
         hiddenimports=[],
         hookspath=[],
         runtime_hooks=[],
         excludes=[],
         win_no_prefer_redirects=False,
         win_private_assemblies=False,
         cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
         cipher=block_cipher)
exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='TripCalc',
      debug=False,
      strip=False,
      upx=True,
      console=False , 
icon='C:\\Users\\test\\Downloads\\TripApp\\Benny.ico')

我尝试在数据旁边添加文件:

('Benny.ico', 'C:\\Users\\test\\Downloads\\TripApp\\BennySM.ico', 'data', 'BgSM.gif', 'C:\\Users\\test\\Downloads\\TripApp\\BgSM.gif', 'data')

但它不会与ValueError: too many values to unpack (expected 2)一起构建。

我按照这篇文章中关于如何将文件路径添加到主python文件的示例。 Bundling data files with PyInstaller --onefile

我能够构建exe并在注释掉的图像的情况下运行它。任何帮助将不胜感激。

当我收到Value Error消息时,我使用以下内容设置spec文件:

block_cipher = None

a = Analysis(['TripCalc.py'],
         pathex=['C:\\Users\\test\\Downloads\\TripApp'],
         binaries=[],
         datas=[('Benny.ico','C:\\Users\\test\\Downloads\\TripApp\\BennySM.ico','data','BgSM.gif','C:\\Users\\test\\Downloads\\TripApp\\BgSM.gif','data')],
         hiddenimports=[],
         hookspath=[],
         runtime_hooks=[],
         excludes=[],
         win_no_prefer_redirects=False,
         win_private_assemblies=False,
         cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
         cipher=block_cipher)
exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='TripCalc',
      debug=False,
      strip=False,
      upx=True,
      console=False , 
icon='C:\\Users\\test\\Downloads\\TripApp\\Benny.ico')

错误窗口

Build -Value Error

对spec文件进行这些更改后,所有内容都会构建,但启动exe时会failed to launch script pops。如果他们打包了exe,他们应该在app数据中的临时文件中找到正确的位置吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

来自(SVG 1.1 2nd edition):

  

添加数据文件:

     

要使捆绑包中包含数据文件,请提供一个列表,将文件描述为datas= Analysis参数的值。数据文件列表是tuples的列表。每个元组都有两个值,两者都必须是字符串:

     

第一个字符串现在指定一个或多个文件。   第二个指定在运行时包含文件的文件夹的名称。

因此,您的datas行必须是:

datas=[
    ('C:\\Users\\test\\Downloads\\TripApp\\BennySM.ico', 'data'),
    ('C:\\Users\\test\\Downloads\\TripApp\\BgSM.gif', 'data'),
],

答案 1 :(得分:1)

为了解决我自己的软件包 - 我尝试使用pip-installable - 我创建了一个我打电话给stringify的软件包。自述文件有主要用例。

stringify的想法是您将图像(以及其他文件类型)构建到.py文件中,这些文件将被PyInstaller本地识别,不需要_MEIPASS或{{ 1}}伏都教您的spec文件变得更加便携,更有可能开箱即用。

此外,如果您打包文件以便在pypi上分发,那么有人会在他们的包中使用您的图片,他们不必进行任何规范文件操作....只是工作!

if sys.frozen内 - 或在您分发包裹之前的某个时间:

setup.py

然后,您可以导入图片并将您的来电替换为from stringify import stringify_py stringify_py('images', 'my_package/images.py') ,如下所示:

tkinter.PhotoImage

有关此方法的示例,您可以引用我的tk_tools包。请查看from images import img # tkinter.PhotoImage(file='/path/to/img.png') # <- your original call tkinter.PhotoImage(data=img) # <- new call setup.py。请注意图像如何存储在tk_tools/visual.py中,直接导入和使用。 PyInstaller将直接使用&#39;标准&#39; spec文件,在构建时减少你的思想共享。