我正在尝试使用pyinstaller构建我一直在开发的程序,但是此后我遇到了二进制文件的问题。这是我的程序。
首先我运行了pyinstall test.py
,然后我使用./dist/main/test
运行了二进制文件,但是遇到了正常运行脚本(例如python3 test.py
)时不会出现的错误。
Traceback (most recent call last):
File "PIL/ImageTk.py", line 181, in paste
_tkinter.TclError: invalid command name "PyImagingPhoto"
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "magic-collection-tracker/test.py", line 22, in <module>
File "magic-collection-tracker/test.py", line 11, in main
File "PIL/ImageTk.py", line 120, in __init__
File "PIL/ImageTk.py", line 185, in paste
ModuleNotFoundError: No module named 'PIL._tkinter_finder'
这是一个重现此问题的最小示例。
from PIL import ImageTk
import PIL.Image
from tkinter import *
window = Tk()
pil_img = PIL.Image.open('./scr_images/blank_card.png')
tkimage = ImageTk.PhotoImage(pil_img)
canvas = Canvas(window)
canvas.create_image(0,0,image=tkimage, anchor=NW)
canvas.pack()
window.mainloop()
我不正确地使用pyinstaller还是存在其他问题?
答案 0 :(得分:0)
我知道这已经超过一个月了,但是我发现自己为此感到挣扎,而且似乎也不想以任何建议的方式工作。
看到其他人将来可能会陷入困境,这就是我使用此修补程序的方式。
首次使用PyInstaller创建可执行文件后,就会创建一个规范文件。
该文件如下所示(对于--onefile):
a = Analysis(['main_file.py'],
pathex=['/root/folder'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
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='app_name',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )
我所做的只是使用datas
以此方式将PIL复制到文件中:
datas=[('/usr/local/lib/python3.7/dist-packages/PIL/','PIL'),],
现在一切正常,直到有时间找到更好的解决方案为止。
请记住,如果在main_file.py
上使用PyInstaller,则规范文件将被覆盖(在这种情况下)。相反,应该使用pyinstaller main_file.spec
。
答案 1 :(得分:0)
我现在晚了2个月,但是为了添加一个更简单的解决方案,我设法通过添加几个隐藏的导入使其工作:
hiddenimports=['PIL', 'PIL._imagingtk', 'PIL._tkinter_finder']