使用PyInstaller后出现“ImportError: cannot import name _imaging”(Python 2)

1 投票
1 回答
2113 浏览
提问于 2025-04-18 13:39

我有一段用Python 2写的代码,直接在Python里运行没问题,但当我用PyInstaller把它打包成可执行文件后,运行时却出现了错误:

Traceback (most recent call last):
  File "<string>", line 26, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/ben/Documents/Programming/Python/Weasyl/Test Scripts/build/test3/out00-PYZ.pyz/PIL.PngImagePlugin", line 40, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/ben/Documents/Programming/Python/Weasyl/Test Scripts/build/test3/out00-PYZ.pyz/PIL.Image", line 53, in <module>
ImportError: cannot import name _imaging

我不太明白为什么它在导入这个模块时会出问题,因为PyInstaller说Tkinter和PIL是兼容的。我的代码完整内容如下:

#!/usr/bin/env python

from Tkinter import *
from PIL import ImageTk, Image
import os

root = Tk()
name = Label(root, text="(username)", font="Arial 20")
name.grid(row=0, column=0)
status = Label(root, text="(login status)")
status.grid(row=1, column=0)
img = ImageTk.PhotoImage(Image.open(".avatar.png"))
panel = Label(root, image=img, relief=RAISED, height=100, width=100)
panel.grid(row=0, column=1, columnspan=2, rowspan=2)
root.mainloop()

我猜问题出在from PIL import ImageTk, Image这行上,但我必须用这个模块,因为我想用的图片是PNG格式,而据我所知,Tkinter在不使用这个模块的情况下只支持GIF格式。

补充:如果我不能在PyInstaller中使用这个模块,有没有其他方法可以在Tkinter中显示PNG图片?

1 个回答

1

我遇到了类似的问题。PIL模块中的Imaging功能不太好使,虽然PyInstaller似乎没有报错。不过,这个问题是在我更新到Linux Mint 17后才出现的。在此之前我用的是Mint 15,那个时候程序编译得很好,也能正常运行。

我想我可能会尝试使用旧版本的PIL,或者找其他方法来加载纹理……

更新: 好消息!看起来在当前的PyInstaller开发版本中,这个问题已经修复了。你可以在这里下载: https://github.com/pyinstaller/pyinstaller

我还尝试把所有的纹理代码改成用PyGame,而不是PIL(因为我在程序中本来就用到了PyGame),但是在用PyInstaller 2.1生成可执行文件后,运行PyGame也遇到了麻烦。

不过,使用从GitHub下载的当前开发版本的PyInstaller,PyGame和PIL都能正常工作了!

撰写回答