Pyinstaller未添加映像



我一直在尝试完成这个简单的程序,并把它变成一个exe,但每次我运行exe我收到以下错误:

Traceback (most recent call last):
File "webtest.py", line 7, in <module>
File "PILImage.py", line 3227, in open
FileNotFoundError: [Errno 2] No such file or directory: 'gs-image.png'

**这是我的程序**

import webbrowser
import pystray
import PIL.Image
image = PIL.Image.open("gs-image.png")
def on_clicked(icon, item):
if str(item) == "Open GS Digi Ecosystem":
webbrowser.open_new("https://www.google.com/")
elif str(item) == "Close":
icon.stop()
icon = pystray.Icon("test", image, menu=pystray.Menu(
pystray.MenuItem("Open GS Digi Ecosystem", on_clicked),
pystray.MenuItem("Close", on_clicked)
))
icon.run()

这是.spec文件夹

block_cipher = None
a = Analysis(
['webtest.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='webtest',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon=['gs-icon.ico'],
)

我的图像都在与原始脚本相同的文件夹中,我使用以下行来创建exe

pyinstaller -i gs-icon.ico --onefile --noconsole webtest.py

我已经尝试将这行添加到.spec中,但我仍然得到相同的错误新增规格行

datas=[('gs-image.png','.')],

然后运行

pyinstaller webtest.spec

我注意到,如果图像文件与exe文件在同一文件中,则程序运行完美。

这是因为"gs-image.png"是一个相对路径。相对路径是相对于用户当前工作目录的。单击运行exe文件时,当前工作目录为exe文件所在目录。这就是为什么如果图像位于与可执行文件相同的目录中,您的程序就会正常运行。

如果你想引用用程序编译的图像,你需要指示你的程序相对于pyinstaller创建的运行时目录查找。

例如:

import webbrowser
import pystray
import PIL.Image
import os
runtime_dir = os.path.dirname(__file__)
gs_image = os.path.join(runtime_dir, "gs-image.png")
image = PIL.Image.open(gs_image)
def on_clicked(icon, item):
if str(item) == "Open GS Digi Ecosystem":
webbrowser.open_new("https://www.google.com/")
elif str(item) == "Close":
icon.stop()
icon = pystray.Icon("test", image, menu=pystray.Menu(
pystray.MenuItem("Open GS Digi Ecosystem", on_clicked),
pystray.MenuItem("Close", on_clicked)
))
icon.run()

最新更新