无法使用 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 添加到setupcommand:

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

在 cx_Freeze 编译后打开图片

使用 win32wnet 导入时使用 cx_freeze 编译后的 DLL 问题

使用 cx_Freeze 时出现问题:“无法导入名称 'tf2'”

无法使用 virtualenv 和 cx_Freeze 将 pygame 转换为可执行文件