无法使用 cx_Freeze 编译
Posted
技术标签:
【中文标题】无法使用 cx_Freeze 编译【英文标题】:Cannot compile with cx_Freeze 【发布时间】:2018-08-30 19:21:38 【问题描述】:我制作了一个运行良好的程序,现在我尝试使用 cx_Freeze 编译它,但得到 TypeError: can only concatenate list (not "NoneType") to list 错误。那么我该如何解决这个问题,以便我可以将我的程序正确编译为 .exe
我的配置: python 2.7,cx_Freeze 5.1.1
我的程序包含以下模块: os、time、string、random、smtplib、_winreg、requests、pyautogui、subprocess、email、SimpleCV
我的设置文件代码:
import sys
from cx_Freeze import setup, Executable
company_name = 'My own company'
product_name = 'Program'
sys.setrecursionlimit(5000)
bdist_msi_options =
'add_to_path': False,
'initial_target_dir': r'[C:\Program Files (x86)]\%s\%s' % (company_name, product_name),
path = sys.path
build_exe_options =
"path": path,
"icon": "myicon.ico"
base = None
if sys.platform == "win32":
base = "Win32GUI"
exe = Executable(script='My_program.py',
base=base,
icon='myicon.ico',
)
setup(name = "My program",
version = "1.1",
description = "This is my first program",
executables = [exe],
options = 'bdist_msi': bdist_msi_options)
错误:
Traceback (most recent call last):
File "setup.py", line 33, in <module>
options = 'bdist_msi': bdist_msi_options)
File "C:\Python27\lib\site-packages\cx_Freeze\dist.py", line 349, in setup
distutils.core.setup(**attrs)
File "C:\Python27\lib\distutils\core.py", line 151, in setup
dist.run_commands()
File "C:\Python27\lib\distutils\dist.py", line 953, in run_commands
self.run_command(cmd)
File "C:\Python27\lib\distutils\dist.py", line 972, in run_command
cmd_obj.run()
File "C:\Python27\lib\distutils\command\build.py", line 127, in run
self.run_command(cmd_name)
File "C:\Python27\lib\distutils\cmd.py", line 326, in run_command
self.distribution.run_command(command)
File "C:\Python27\lib\distutils\dist.py", line 972, in run_command
cmd_obj.run()
File "C:\Python27\lib\site-packages\cx_Freeze\dist.py", line 219, in run
freezer.Freeze()
File "C:\Python27\lib\site-packages\cx_Freeze\freezer.py", line 623, in Freeze
self._WriteModules(fileName, self.finder)
File "C:\Python27\lib\site-packages\cx_Freeze\freezer.py", line 600, in _WriteModules
path = os.pathsep.join([origPath] + module.parent.path)
TypeError: can only concatenate list (not "NoneType") to list
【问题讨论】:
你看过***.com/q/39007134/8516269 吗?您使用的是哪个 cx_Freeze 版本? 是的,我看过但什么都不懂。我正在使用 5.1.1 版的 cx_Freeze。 【参考方案1】:解决方法是将opencv_ffmpeg342.dll文件放在可执行文件所在的同一目录下。
opencv_ffmpeg342.dll位于[你安装python的地方] \Lib\site-packages\cv2
【讨论】:
这可以通过将include-files: ['[Place where you have installed python]/Lib/site-packages/cv2/opencv_ffmpeg342.dll']
添加到设置脚本中的build_exe
选项来完成。【参考方案2】:
模块cv2
导致与cx_Freeze
的无限递归,参见cx_Freeze - opencv compatibility
删除声明
sys.setrecursionlimit(5000)
来自您的安装脚本。然后您应该会看到以下错误
module = self._modules[name] = Module(name)
RuntimeError: maximum recursion depth exceeded while calling a Python object
如果您可以不使用cv2
,则可以将其排除在外(请参阅下面的操作方法)。
我想另一个问题可能是 SimpleCV 需要 numpy 和 scipy,并且这些包需要明确包含在 cx_Freeze 设置脚本中。
总之,尝试修改你的build_exe_options
如下:
build_exe_options = "path": path,
"include_files": ["myicon.ico"],
"packages": ["numpy", "scipy"],
"excludes": ["scipy.spatial.cKDTree", "cv2"]
path
选项实际上不是必需的,因为默认值为sys.path
。
icon
选项不存在,我猜你打算使用include_files
。如果您不使用程序本身的图标文件,则可能不需要此选项。
不要忘记将build_exe_options
添加到setup
command:
setup(name = "My program",
version = "1.1",
description = "This is my first program",
executables = [exe],
options = 'build_exe': build_exe_options,
'bdist_msi': bdist_msi_options)
在我的 Linux 机器上,在进行这些修改后,我仍然收到由 matplotlib
引起的错误(请参阅 cx_freeze error with matplotlib data),但它们似乎特定于 Linux,因此在 Windows 下它可能对您有用。
【讨论】:
感谢您帮助我。但是我得到了 ImportError: No module named 'scipy' 虽然我已经安装了 scipy 模块。现在我该如何解决这个错误? 有这个问题:***.com/q/32432887/8516269 但实际上自 cx_Freeze 5.1 起已更正 仍然无法弄清楚。我得到同样的错误 ImportError: No module named 'scipy' 请帮我摆脱这个错误 我已经进行了一些测试,并根据结果更新了我的答案。我希望这可以进一步帮助你。 如果我排除了 cv2 模块,那么我可能无法从网络摄像头捕获任何图片,这会使我的程序无用。以上是关于无法使用 cx_Freeze 编译的主要内容,如果未能解决你的问题,请参考以下文章
无法运行播放通过 cx_Freeze 编译的 OGG 文件的 Pygame 脚本
无法为 Python 3.7 64 位安装 cx_Freeze 或 scipy
使用 win32wnet 导入时使用 cx_freeze 编译后的 DLL 问题