Невозможно скомпилировать с помощью cx_Freeze - PullRequest
0 голосов
/ 30 августа 2018

Я создал программу, которая работала нормально, и теперь я попытался скомпилировать ее с помощью cx_Freeze, но получил TypeError: можно только объединить список (не "NoneType"), чтобы отобразить ошибку . Так как я могу исправить эту проблему, чтобы я мог правильно скомпилировать свою программу в .exe

Моя конфигурация: python 2.7, cx_Freeze 5.1.1

Моя программа содержит следующие модули: os, время, строка, random, smtplib, _winreg, запросы, pyautogui, подпроцесс, электронная почта, 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

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Решением является размещение файла opencv_ffmpeg342.dll в том же каталоге, где находится исполняемый файл.

opencv_ffmpeg342.dll находится в [ месте, где вы установили python ] \ Lib \ site-packages \ cv2

0 голосов
/ 31 августа 2018

Модуль cv2 вызывает бесконечную рекурсию с cx_Freeze, см. cx_Freeze - совместимость с opencv

Удалить утверждение

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 с данными matplotlib ), но они кажутся специфическими для Linux, поэтому в Windows это может работать для вас.

...