使用cx_freeze导入PIL时出错



我已经做了一整天了,我正要把我的电脑扔出窗外。我使用tkinter、matplotlib和PIL制作了一个UI。如果我运行代码,这可以很好地工作,但是当使用cx_freeze进行冻结时,我在执行python setup.py build:时会得到以下内容

c:Python33>python setup.py build
running build
running build_exe
Traceback (most recent call last):
  File "setup.py", line 18, in <module>
    executables = [Executable("interface.py", base = base, icon="link.ico")]
  File "c:Python33libsite-packagescx_Freezedist.py", line 365, in setup
    distutils.core.setup(**attrs)
  File "c:Python33libdistutilscore.py", line 148, in setup
    dist.run_commands()
  File "c:Python33libdistutilsdist.py", line 929, in run_commands
    self.run_command(cmd)
  File "c:Python33libdistutilsdist.py", line 948, in run_command
    cmd_obj.run()
  File "c:Python33libdistutilscommandbuild.py", line 126, in run
    self.run_command(cmd_name)
  File "c:Python33libdistutilscmd.py", line 313, in run_command
    self.distribution.run_command(command)
  File "c:Python33libdistutilsdist.py", line 948, in run_command
    cmd_obj.run()
  File "c:Python33libsite-packagescx_Freezedist.py", line 235, in run
    freezer.Freeze()
  File "c:Python33libsite-packagescx_Freezefreezer.py", line 575, in Freeze
    self.finder = self._GetModuleFinder()
  File "c:Python33libsite-packagescx_Freezefreezer.py", line 330, in _GetMo
duleFinder
    finder.IncludePackage(name)
  File "c:Python33libsite-packagescx_Freezefinder.py", line 579, in Include
Package
    module = self._ImportModule(name, deferredImports)
  File "c:Python33libsite-packagescx_Freezefinder.py", line 288, in _Import
Module
    raise ImportError("No module named %r" % name)
ImportError: No module named 'PIL'

我的源代码在导入中有以下内容:

import pymysql
import csv
from itertools import groupby
from collections import defaultdict
from collections import OrderedDict
import math
import os
import glob
from tkinter import *
from tkinter import ttk
import tkinter.filedialog
import tkinter.messagebox
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
from tkinter import PhotoImage
import PIL
import win32com.client

正如我上面所说的,它运行良好。有没有一种手动导入的方法或类似的方法?我在很多网站上读到cx_freeze在导入某些模块的某些依赖项时遇到问题。

最初,我只是在编译时遇到了这个错误,然后在点击可执行文件时出现了上面的错误。我试图直接在setup.py文件上添加PIL模块,但在cmd上也出现了同样的错误。

这里是setup.py以防万一:

import sys
from cx_Freeze import setup, Executable

base = None
if sys.platform == "win32":
    base = "Win32GUI"
build_exe_options = {"packages": ["PIL"]}
setup(
        name = "Link",
        version = "1.0",
        description = "SLA screen program for CRM.",
        options = {"build_exe": build_exe_options}, 
        executables = [Executable("interface.py", base = base, icon="link.ico")]

)

关于如何让它发挥作用,有什么想法吗?

谢谢!!

编辑:我很高兴这个解决方案对您有效!我会把它从评论中移到这里,以防它能帮助其他人。


解决方案:我在StackOverflow上发现了类似的错误,OP似乎已经找到了解决自己问题的方法。他说,他在安装的一个软件包版本上错误地使用了pip-install,并将该软件包下载为.egg文件,这似乎导致cx_freeze出现问题。可能不是解决方案,但在故障排除方面值得一试。

cx_freeze如何包括第三方模块,ImportError:没有名为progressbar 的模块

我有同样的错误消息,并通过以下步骤解决了它(我使用的是Windows):

  1. 从命令提示符(pip uninstall Pillow)卸载Pillow

  2. 下载.exe文件版本的新枕头包

    在我的例子中,我使用的是Python 3.4,所以我为我的Python版本选择了合适的.exe文件。

  3. 安装exe文件

  4. 从cmd提示符(C:/python34/python/python setup.py build)再次运行setup.py

没有更多错误。

最新更新