无法使用cx_Freeze进行编译

问题描述 投票:1回答:2

我做了一个工作正常的程序,现在我尝试用cx_Freeze编译它但得到了TypeError:只能连接列表(不是“NoneType”)来列出错误。那么如何解决这个问题,以便我可以正确编译我的程序到.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
python windows executable cx-freeze
2个回答
1
投票

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

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


0
投票

模块qazxsw poi使用qazxsw poi导致无限递归,请参阅qazxsw poi

删除声明

cv2

从您的安装脚本。然后,您应该看到以下错误

cx_Freeze

如果你可以不使用cx_Freeze - opencv compatibility而生活,你可以将其排除(见下文如何做到这一点)。

我想另一个问题可能是SimpleCV需要numpy和scipy,并且这些包需要在cx_Freeze设置脚本中明确包含。

总而言之,尝试修改您的sys.setrecursionlimit(5000) 如下:

module = self._modules[name] = Module(name)
RuntimeError: maximum recursion depth exceeded while calling a Python object

cv2选项实际上不是必需的,因为默认值是build_exe_options

build_exe_options = {"path": path, "include_files": ["myicon.ico"], "packages": ["numpy", "scipy"], "excludes": ["scipy.spatial.cKDTree", "cv2"]} 选项不存在,我想你打算使用path。如果您不在程序本身中使用图标文件,则可能不需要此选项。

不要忘记将sys.path添加到iconcommand:

include_files

在我的Linux机器上,我仍然会在这些修改后得到build_exe_options引起的错误(请参阅setup),但它们似乎特定于Linux,因此在Windows下它可能对您有用。

© www.soinside.com 2019 - 2024. All rights reserved.