我制作了一个运行良好的程序,现在尝试使用cx_Freeze进行编译,但出现 TypeError:只能将列表(而不是“ NoneType”)连接到列表错误。因此,如何解决此问题,以便可以将程序正确编译为.exe
我的配置: python 2.7,cx_Freeze 5.1.1
我的程序包含以下模块: 操作系统,时间,字符串,随机,smtplib,_winreg,请求,pyautogui,子进程,电子邮件,SimpleCV
我的设置文件代码:
alert
错误:
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})
答案 0 :(得分:1)
该解决方案将 opencv_ffmpeg342.dll 文件放置在可执行文件所在的目录中。
opencv_ffmpeg342.dll 位于[安装python的地方] \ Lib \ site-packages \ cv2
答案 1 :(得分:0)
模块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
命令:
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下它可能对您有用。