我已经做了一整天了,我正要把我的电脑扔出窗外。我使用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):
-
从命令提示符(
pip uninstall Pillow
)卸载Pillow -
下载.exe文件版本的新枕头包
在我的例子中,我使用的是Python 3.4,所以我为我的Python版本选择了合适的.exe文件。
-
安装exe文件
-
从cmd提示符(
C:/python34/python/python setup.py build
)再次运行setup.py
没有更多错误。