我运行build命令,所有内容似乎都正确构建,直到我尝试启动exe并弹出此消息:
这是我的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')
错误窗口
对spec文件进行这些更改后,所有内容都会构建,但启动exe时会failed to launch script pops。如果他们打包了exe,他们应该在app数据中的临时文件中找到正确的位置吗?
谢谢!
答案 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文件,在构建时减少你的思想共享。