【问题标题】:Pyinstaller: Images fail to extractPyinstaller:图像无法提取
【发布时间】:2017-02-10 17:07:25
【问题描述】:

我运行构建命令,一切似乎都正确构建,直到我尝试启动 exe 并弹出此消息:

这是我的规范文件,我不确定为什么它似乎将文件路径与两个图像组合在一起。

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 并使用注释掉的图像运行它。任何帮助将不胜感激。

当我收到值错误消息时,我使用以下内容设置规范文件:

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')

错误窗口

随着对规范文件的这些更改,一切都会构建,但在启动 exe 时会出现failed to launch script pops。如果它们与 exe 打包在一起,它们应该位于应用数据中的临时文件中正确吗?

谢谢!

【问题讨论】:

    标签: python pyinstaller


    【解决方案1】:

    来自 (DOCS):

    添加数据文件:

    要让数据文件包含在包中,请提供一个列表,将文件描述为Analysisdatas= 参数的值。数据文件列表是tuples 的列表。每个元组都有两个值,这两个值都必须是字符串:

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

    所以您的datas 行需要类似于:

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

    【讨论】:

      【解决方案2】:

      为了解决我自己的包的这个问题——我试图让 pip 可安装——我创建了一个包,我称之为stringify。自述文件有主要用例。

      stringify 的想法是您将图像(以及其他文件类型)构建到将被 PyInstaller 本地识别的.py 文件中,不需要_MEIPASSif sys.frozen voodoo。您的规范文件变得更便携,更有可能开箱即用。

      此外,如果您将文件打包以在 pypi 上分发,那么有人在他们的包中使用您的图像,他们不必进行任何规范文件操作....它就可以了!

      setup.py 内 - 或在您分发包之前的某个时间:

      from stringify import stringify_py
      
      stringify_py('images', 'my_package/images.py')
      

      然后您可以导入您的图像并将您的呼叫替换为tkinter.PhotoImage,如下所示:

      from images import img
      
      # tkinter.PhotoImage(file='/path/to/img.png')  # <- your original call
      tkinter.PhotoImage(data=img)  # <- new call
      

      此方法的示例,您可以参考我的tk_tools 包。看看setup.pytk_tools/visual.py。请注意图像是如何存储在tk_tools/images.py 中的,它是直接导入和使用的。 PyInstaller 将使用“标准”规范文件直接获取这些内容,从而减少您在构建时的思想分享。

      【讨论】:

        猜你喜欢
        • 2021-12-12
        • 2022-01-17
        • 1970-01-01
        • 2017-05-29
        • 2020-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-14
        相关资源
        最近更新 更多