python Pyinstaller不添加映像

8nuwlpux  于 2023-01-19  发布在  Python
关注(0)|答案(1)|浏览(112)

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

Traceback (most recent call last):
  File "webtest.py", line 7, in <module>
  File "PIL\Image.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,但仍然收到相同的错误 Added Spec line

datas=[('gs-image.png','.')],
  • 然后跑 *
pyinstaller webtest.spec

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

waxmsbnn

waxmsbnn1#

这是因为"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()

相关问题