2

我编写了一个相当简单的 GUI 程序,用 Python 为 Windows 用户自动执行一些流程(因为它是我比较熟悉的唯一可以在 Windows 上运行的编程语言)。理想情况下,我不希望用户必须在他们的机器上运行安装程序,因为我的计划是让它在 USB 驱动器中独立运行。

它依赖于 os、shutil、string、sys、tkinter、webbrowser、PIL、ftplib 和 glob。

当我在它上面运行 cx_freeze 时,似乎所有的依赖项都被导入了,除了 PIL。我以前从未使用过 cx_freeze,所以我可能做错了什么,但看起来不像。从解冻的 .py 脚本运行程序就可以了。

这是我在尝试使用 PIL 命令时收到的错误消息:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python32\lib\tkinter\__init__.py", line 1399, in __call__
    return self.func(*args)
  File "E:\AlbumUploader.py", line 143, in OnButton2Click
    img.thumbnail(size, Image.ANTIALIAS)
  File "C:\Python32\lib\site-packages\PIL\Image.py", line 1573, in thumbnail
    self.load()
  File "C:\Python32\lib\site-packages\PIL\ImageFile.py", line 168, in load
    self.load_prepare()
  File "C:\Python32\lib\site-packages\PIL\ImageFile.py", line 234, in load_prepare
    self.im = Image.core.new(self.mode, self.size)
  File "C:\Python32\lib\site-packages\PIL\Image.py", line 39, in __getattr__
    raise ImportError("The _imaging C module is not installed")
ImportError: The _imaging C module is not installed

感谢您的任何帮助,您可以提供。我看到它仍在引用 C:\Python32 这可能是问题的一部分,因为它不应该是(如果我没记错的话)。

更新:

我查看了 PIL 常见问题解答,似乎该答案的要点是我需要确保我的 sys.path 列表是正确的。我基本上抓取了所有适用于 Windows 的 Python 文件并将其包含在我试图用来包含所有内容的 USB 驱动器中,并将我的路径设置为:

program_dir = os.path.split(sys.argv[0])[0]
sys.path = [program_dir]
sys.path.append(program_dir + os.sep + 'Lib')
sys.path.append(program_dir + os.sep + 'Lib' + os.sep + 'site-packages')
sys.path.append(program_dir + os.sep + 'Lib' + os.sep + 'site-packages' + os.sep + 'PIL')
sys.path.append(program_dir + os.sep + 'DLLs')

所有路径似乎都是正确的,但由于某种原因,我仍然遇到同样的错误。当我运行 .py 文件时,一切都 100% 正常工作,但这似乎以某种方式破坏了它。其他模块似乎工作得很好,例如 shutil、os 和 sys。

4

2 回答 2

4

我认为您的主要问题可能是 Python Imaging Library (PIL) 尚不支持 Python 3.x。

如果您查看PIL 下载页面,您会看到有适用于 Python 2.4、2.5、2.6 和 2.7 的 Windows 下载,但没有适用于 Python 3.x 的下载。

这个问题有一个答案,其中详细说明了 Python 3.x 的 PIL 的非官方端口,这可能值得一试。

如果可行,您可以查看PIL FAQ 上的第一个问题,该问题是关于“未安装 _imaging C 模块”错误并列出了您可以采取的各种措施来识别问题。

于 2012-01-24T13:50:12.050 回答
0

在过去,我发现 cx_Freeze 在 Windows 下拉入正确的 DLL 时遇到问题。

我使用Process Explorer来追踪正在寻找但未找到的 DLL,然后手动将它们添加到项目中,这样就可以正常工作了。因为它对任何文件都会做同样的事情,我想在你的情况下也可以这样做。

这是我在 PySFML 中使用的,所以你的里程可能会有所不同。

于 2012-01-24T13:54:46.140 回答