无法使用cx_Freeze进行编译

时间:2018-08-30 19:21:38

标签: python windows executable cx-freeze

我制作了一个运行良好的程序,现在尝试使用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})

2 个答案:

答案 0 :(得分:1)

该解决方案将 opencv_ffmpeg342.dll 文件放置在可执行文件所在的目录中。

  

opencv_ffmpeg342.dll 位于[安装python的地方] \ Lib \ site-packages \ cv2

答案 1 :(得分:0)

模块cv2cx_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下它可能对您有用。