marcelotduarte / cx_Freeze

cx_Freeze creates standalone executables from Python scripts, with the same performance, is cross-platform and should work on any platform that Python itself works on.
https://marcelotduarte.github.io/cx_Freeze/
Other
1.32k stars 217 forks source link

Error in `cx_Freeze/common.py` on Windows, version 'cx-Freeze-6.6.dev0' #932

Closed kristofmulier closed 3 years ago

kristofmulier commented 3 years ago

When using the development version of cx_Freeze on Windows 10, Python 3.9 it crashes because of an error in 'C:\Python39\lib\site-packages\cx_Freeze\common.py'. Below is the detailed info.

1. Installation

I just finished a fresh Python 3.9 installation on my 64-bit Windows 10 computer:

Python 3.9.2 (tags/v3.9.2:1a79785, Feb 19 2021, 13:44:55) [MSC v.1928 64 bit (AMD64)] on win32

The master branch of cx_Freeze failed to install, so I tried the development branch:

>python -m pip install --upgrade pip

>pip install git+https://github.com/marcelotduarte/cx_Freeze.git@develop

Collecting git+https://github.com/marcelotduarte/cx_Freeze.git@develop
  Cloning https://github.com/marcelotduarte/cx_Freeze.git (to revision develop) to c:\users\gebruiker\appdata\local\temp\pip-req-build-e_08uc8v
  Running command git clone -q https://github.com/marcelotduarte/cx_Freeze.git 'C:\Users\Gebruiker\AppData\Local\Temp\pip-req-build-e_08uc8v'
  Running command git checkout -b develop --track origin/develop
  Branch 'develop' set up to track remote branch 'develop' from 'origin'.
  Switched to a new branch 'develop'
  Running command git submodule update --init --recursive -q
Collecting importlib_metadata>=3.1.1
  Downloading importlib_metadata-3.6.0-py3-none-any.whl (11 kB)
Collecting zipp>=0.5
  Downloading zipp-3.4.0-py3-none-any.whl (5.2 kB)
Building wheels for collected packages: cx-Freeze
  Building wheel for cx-Freeze (setup.py) ... done
  Created wheel for cx-Freeze: filename=cx_Freeze-6.6.dev0-cp39-cp39-win_amd64.whl size=260278 sha256=e6dd5ffe13f0605d1d3186021cd92ef55b82a1cddbda7f70ea075c33691180f6
  Stored in directory: C:\Users\Gebruiker\AppData\Local\Temp\pip-ephem-wheel-cache-weniakca\wheels\a5\70\ed\6205fdcb1ba8d2aebf60c642df09b426732325220e757fda89
Successfully built cx-Freeze
Installing collected packages: zipp, importlib-metadata, cx-Freeze
Successfully installed cx-Freeze-6.6.dev0 importlib-metadata-3.6.0 zipp-3.4.0

This installation was successful.

2. Use

When using cx_Freeze, it crashes with the following message:

Traceback (most recent call last):
  File "C:\Seafile\EMBEETLE IDE\embeetle\beetle_core\to_exe\freeze_embeetle.py", line 715, in <module>
    result = freeze_embeetle(
  File "C:\Seafile\EMBEETLE IDE\embeetle\beetle_core\to_exe\freeze_embeetle.py", line 465, in freeze_embeetle
    freezer = cx_Freeze.Freezer(
  File "C:\Python39\lib\site-packages\cx_Freeze\freezer.py", line 90, in __init__
    self.includeFiles = process_path_specs(includeFiles)
  File "C:\Python39\lib\site-packages\cx_Freeze\common.py", line 60, in process_path_specs
    for spec in specs:
TypeError: 'NoneType' object is not iterable

I hope this helps for debugging. Please let me know if you have a fix.

marcelotduarte commented 3 years ago

The master branch of cx_Freeze failed to install,

What is the error? Have you tried pip install -U cx-freeze ?

When using cx_Freeze, it crashes with the following message:

Can you post your setup.py or at least the line of include_files option of build_exe?

EDIT: master branch doesn't exit. Now it is main branch.

kristofmulier commented 3 years ago

Hi @marcelotduarte , Our Freeze script is rather long. So I've tried to figure out where precisely the error gets triggered. It turns out to be at this statement:

    freezer = cx_Freeze.Freezer(
        executables,
        includes          = modules,
        #excludes         = ['tkinter'],
        replacePaths      = [],
        compress          = True,
        optimizeFlag      = True,
        path              = search_path,
        targetDir         = freeze_directory,
        zipIncludes       = [],
        silent            = False,
    )

So the error manifests itself when our freeze script tries to instantiate the cx_Freeze.Freezer() object. Just for refreshing the memory, this is the error message:

Traceback (most recent call last):
  File "C:\Seafile\EMBEETLE IDE\embeetle\beetle_core\to_exe\freeze_embeetle.py", line 732, in <module>

    result = freeze_embeetle(
  File "C:\Seafile\EMBEETLE IDE\embeetle\beetle_core\to_exe\freeze_embeetle.py", line 481, in freeze_embeetle
    freezer = cx_Freeze.Freezer(
  File "C:\Python39\lib\site-packages\cx_Freeze\freezer.py", line 90, in __init__
    self.includeFiles = process_path_specs(includeFiles)
  File "C:\Python39\lib\site-packages\cx_Freeze\common.py", line 60, in process_path_specs
    for spec in specs:
TypeError: 'NoneType' object is not iterable

I've put a print stament right above the offending statement, to see what parameters are exactly given to instantiate cx_Freeze.Freezer():

freezer = cx_Freeze.Freezer(
    [<Executable script=embeetle.py>],
    includes     = ['data', 'functions', 'purefunctions', 'beetle_console.console_contextmenu', 'beetle_console.console_widget', 'beetle_console.interactive_command', 'beetle_console.make_console', 'beetle_console.mini_console', 'beetle_console.serial_port', 'beetle_console.standalone_console', 'beetle_console.test_console', 'bpathlib.file_power', 'bpathlib.path_obj', 'bpathlib.path_power', 'bpathlib.tool_obj', 'bpathlib.treepath_obj', 'bpathlib.ziplongpath', 'clang_button.clang_button', 'clang_button.clang_contextmenu', 'clang_button.item', 'clang_digester.digester', 'clang_digester.digest_queue', 'clang_feeder.feeder', 'clang_feeder.feeder_queue', 'clang_interaction.clang_to_dashboard', 'clang_interaction.clang_to_dirtree', 'clang_interaction.dashboard_to_clang', 'clang_interaction.dirtree_to_clang', 'components.actionfilter', 'components.buttonparser', 'components.clanginterface', 'components.communicator', 'components.cursor_manager', 'components.customstyle', 'components.decorators', 'components.diagnostics', 'components.fifo_queue', 'components.filechecker', 'components.hexbuilding', 'components.hexpainting', 'components.history', 'components.hotspots', 'components.iconmanipulator', 'components.interpreter', 'components.keyboardmanipulator', 'components.linelist', 'components.reader', 'components.singleton', 'components.symbolhandler', 'components.thesquid', 'components.thread_switcher', 'contextmenu.contextmenu', 'contextmenu.contextmenu_launcher', 'contextmenu.path_contextmenu', 'dirdash.general_item', 'dirdash.common.chassis.chassis', 'dirdash.common.helpers.item_emitter', 'dirdash.common.helpers.item_layout', 'dirdash.common.helpers.spacer_layout', 'dirdash.common.items.item', 'dirdash.common.widgets.item_arrow', 'dirdash.common.widgets.item_btn', 'dirdash.common.widgets.item_chbx', 'dirdash.common.widgets.item_img', 'dirdash.common.widgets.item_lbl', 'dirdash.common.widgets.item_lineedit', 'dirdash.common.widgets.item_progbar', 'dirdash.common.widgets.item_richlbl', 'dirdash.common.widgets.item_widget', 'dirdash.dashboard.chassis.dashboard', 'dirdash.dashboard.chassis.dashboard_worker', 'dirdash.dashboard.contextmenus.chip_contextmenu', 'dirdash.dashboard.contextmenus.lib_contextmenu', 'dirdash.dashboard.contextmenus.probe_comport_contextmenu', 'dirdash.dashboard.contextmenus.probe_contextmenu', 'dirdash.dashboard.contextmenus.progbar_contextmenu', 'dirdash.dashboard.contextmenus.settings_contextmenu', 'dirdash.dashboard.contextmenus.tool_contextmenu', 'dirdash.dashboard.contextmenus.toplvl_contextmenu', 'dirdash.dashboard.contextmenus.treepath_contextmenu', 'dirdash.dashboard.contextmenus.specific_components.chip_contextmenu_parts', 'dirdash.dashboard.contextmenus.specific_components.probe_contextmenu_parts', 'dirdash.dashboard.contextmenus.specific_components.tool_contextmenu_parts', 'dirdash.dashboard.items.item', 'dirdash.dashboard.items.banner_items.banner_items', 'dirdash.dashboard.items.board_items.board_items', 'dirdash.dashboard.items.chip_items.chip_items', 'dirdash.dashboard.items.lib_items.lib_info_items', 'dirdash.dashboard.items.lib_items.lib_items', 'dirdash.dashboard.items.path_items.toolpath_items', 'dirdash.dashboard.items.path_items.treepath_items', 'dirdash.dashboard.items.path_items.treepath_item_helper', 'dirdash.dashboard.items.probe_items.probe_comportitem', 'dirdash.dashboard.items.probe_items.probe_items', 'dirdash.dashboard.items.rtos_items.rtos_items', 'dirdash.dirtree.chassis.dirtree', 'dirdash.dirtree.chassis.dirtree_folder_init', 'dirdash.dirtree.chassis.dirtree_save_load', 'dirdash.dirtree.contextmenus.chbx_contextmenu', 'dirdash.dirtree.contextmenus.dir_contextmenu', 'dirdash.dirtree.contextmenus.file_contextmenu', 'dirdash.dirtree.contextmenus.settings_contextmenu', 'dirdash.dirtree.items.dirtree_calc', 'dirdash.dirtree.items.item', 'dirdash.dirtree.widgets.item_chbx', 'dirdash.toolmanager.chassis.toolmanager', 'dirdash.toolmanager.chassis.toolmanager_worker', 'dirdash.toolmanager.contextmenus.info_items_contextmenu', 'dirdash.toolmanager.contextmenus.settings_contextmenu', 'dirdash.toolmanager.contextmenus.toolmanager_contextmenu', 'dirdash.toolmanager.items.add_item', 'dirdash.toolmanager.items.info_items', 'dirdash.toolmanager.items.item', 'dirdash.toolmanager.items.build_automation_items.build_automation_items', 'dirdash.toolmanager.items.flash_debug_server_items.flash_debug_server_items', 'dirdash.toolmanager.items.toolchain_items.toolchain_items', 'gui.dialogs.okdialog', 'gui.dialogs.popupdialog', 'gui.dialogs.projectcreationdialogs', 'gui.dialogs.scalingdialog', 'gui.dialogs.searchreplacedialog', 'gui.dialogs.splashscreen', 'gui.fonts.fontloader', 'gui.forms.customeditor', 'gui.forms.dockingoverlay', 'gui.forms.functionwheel', 'gui.forms.homewindow', 'gui.forms.informationoverlay', 'gui.forms.mainwindow', 'gui.forms.messagewindow', 'gui.forms.plaineditor', 'gui.forms.replhelper', 'gui.forms.repllineedit', 'gui.forms.tabwidget', 'gui.forms.thebox', 'gui.helpers.advancedcombobox', 'gui.helpers.advancedlineedit', 'gui.helpers.buttons', 'gui.helpers.contextmenu', 'gui.helpers.custom_grid_layout', 'gui.helpers.diagnosticwindow', 'gui.helpers.html_combobox', 'gui.helpers.info', 'gui.helpers.messagelogger', 'gui.helpers.popupbubble', 'gui.helpers.popupsplitter', 'gui.helpers.progresswidget', 'gui.helpers.projectdisplay', 'gui.helpers.qswaplayout', 'gui.helpers.searchbar', 'gui.helpers.searchresultswindow', 'gui.helpers.sessionmanipulator', 'gui.helpers.settingsmanipulator', 'gui.helpers.sourceanalysisbutton', 'gui.helpers.standalonetextdiffer', 'gui.helpers.symbolpopup', 'gui.helpers.symbolwindow', 'gui.helpers.textdiffer', 'gui.helpers.treedisplay', 'gui.helpers.windowsplitter', 'gui.stylesheets.button', 'gui.stylesheets.button_fast', 'gui.stylesheets.checkbox', 'gui.stylesheets.combobox', 'gui.stylesheets.groupbox', 'gui.stylesheets.helper', 'gui.stylesheets.label', 'gui.stylesheets.popupMenu', 'gui.stylesheets.progressbar', 'gui.stylesheets.scrollbar', 'gui.stylesheets.slider', 'gui.stylesheets.splitter', 'gui.stylesheets.statusbar', 'gui.stylesheets.tabbar', 'gui.stylesheets.table', 'gui.stylesheets.tabwidget', 'gui.stylesheets.textbox', 'gui.stylesheets.treewidget', 'gui.stylesheets.dirdash.chassis', 'gui.stylesheets.dirdash.chassis_segment', 'gui.stylesheets.dirdash.itemlbl', 'gui.stylesheets.dirdash.lineEdit', 'gui.templates.baseappwindow', 'gui.templates.basemenu', 'gui.templates.basenodewindow', 'gui.templates.baseprogressbar', 'gui.templates.baseslider', 'gui.templates.basetoolbar', 'gui.templates.basewidget', 'gui.templates.combobox', 'gui.templates.editorbase', 'gui.templates.generaldialog', 'gui.templates.generaldockwidget', 'gui.templates.treedisplaybase', 'gui.templates.treewidget', 'gui.templates.widgetgenerator', 'help.help_texts', 'help.help_subjects.blasphemy', 'help.help_subjects.compilation', 'help.help_subjects.console', 'help.help_subjects.dashboard', 'help.help_subjects.debug', 'help.help_subjects.diagnostics', 'help.help_subjects.dirtree', 'help.help_subjects.editor', 'help.help_subjects.flashing', 'help.help_subjects.general', 'help.help_subjects.home_window', 'help.help_subjects.libraries', 'help.help_subjects.license', 'help.help_subjects.new_tool_wizard', 'help.help_subjects.projstruct', 'help.help_subjects.source_analyzer', 'help.help_subjects.symbolwindow', 'help.help_subjects.tools', 'help.help_subjects.tooltips', 'lexers.ada', 'lexers.c', 'lexers.custompython', 'lexers.cython', 'lexers.functions', 'lexers.linkerscript', 'lexers.nim', 'lexers.oberon', 'lexers.python', 'lexers.routeros', 'lexers.text', 'library_manager.json_cruncher', 'library_manager.json_filter', 'library_manager.json_helper', 'library_manager.lib_const', 'library_manager.lib_manager', 'library_manager.lib_table', 'library_manager.cell_widgets.cell_author', 'library_manager.cell_widgets.cell_header', 'library_manager.cell_widgets.cell_name', 'library_manager.cell_widgets.cell_origin', 'library_manager.cell_widgets.cell_paragraph', 'library_manager.cell_widgets.cell_sentence', 'library_manager.cell_widgets.cell_version', 'library_manager.cell_widgets.cell_widget', 'library_manager.download_wizard.download_wizard', 'library_manager.filter_widgets.author_groupbox', 'library_manager.filter_widgets.author_linebox', 'library_manager.filter_widgets.search_groupbox', 'library_manager.filter_widgets.search_linebox', 'library_manager.filter_widgets.topic_combobox', 'library_manager.filter_widgets.topic_groupbox', 'library_manager.gen_widgets.linebox', 'library_manager.gen_widgets.progbar', 'library_manager.storage_widgets.proj_storage_groupbox', 'library_manager.storage_widgets.search_paths_groupbox', 'library_manager.storage_widgets.search_paths_linebox', 'parsing.ctagsparser', 'parsing.fileparser', 'parsing.parsedatabase', 'parsing.parsetools', 'project.constants', 'project.elf_reader', 'project.exotic_project_launcher', 'project.linker_reader', 'project.makefile_target_executer', 'project.project', 'project.project_report', 'project.readelf', 'project.segments.project_segment', 'project.segments.board_seg.board', 'project.segments.chip_seg.chip', 'project.segments.lib_seg.lib_seg', 'project.segments.path_seg.path_seg', 'project.segments.path_seg.toolpath_seg', 'project.segments.path_seg.treepath_seg', 'project.segments.probe_seg.probe', 'project.segments.rtos_seg.rtos', 'project_generator.fix_warnings', 'project_generator.helper', 'project_generator.projectlist_filegen', 'project_generator.arduino.arduino_gen', 'project_generator.arduino.arduino_importer', 'project_generator.generator.dashboard_mk_generator', 'project_generator.generator.file_changer', 'project_generator.generator.file_generator', 'project_generator.generator.merger', 'project_generator.generator.project_generator', 'project_generator.giga.giga_gen', 'project_generator.giga.giga_importer', 'project_generator.nordic.nordic_gen', 'project_generator.nordic.nordic_importer', 'project_generator.nuvoton.nuvoton_gen', 'project_generator.nuvoton.nuvoton_importer', 'project_generator.stmicro.stmicro_gen', 'project_generator.stmicro.stmicro_importer', 'settings.settings', 'source_analyzer.flag_extractor', 'source_analyzer.source_analyzer', 'source_analyzer.template', 'themes.air', 'themes.earth', 'themes.mc', 'themes.water', 'toolmanager.toolmanager', 'toolmanager.version_extractor', 'updater_updater.updater', 'wizards.intro_wizard.intro_wizard', 'wizards.intro_wizard.page_one.page_one', 'wizards.intro_wizard.page_one.page_one_intro', 'wizards.intro_wizard.page_zero.item', 'wizards.intro_wizard.page_zero.page_zero', 'wizards.intro_wizard.page_zero.page_zero_chip', 'wizards.intro_wizard.page_zero.page_zero_intro', 'wizards.intro_wizard.page_zero.page_zero_probe', 'wizards.intro_wizard.page_zero.page_zero_projectlyt', 'wizards.intro_wizard.page_zero.page_zero_tools', 'wizards.tool_wizard.new_tool_wizard', 'wizards.tool_wizard.page_one', 'wizards.tool_wizard.page_two', 'wizards.tool_wizard.page_zero', 'wizards.tool_wizard.wizard_helper', 'ctypes', 'PyQt5', 'PyQt5.Qsci', 'PyQt5.QtTest', 'elftools', 'elftools.common.exceptions', 'elftools.common.py3compat', 'elftools.elf.elffile', 'elftools.elf.dynamic', 'elftools.elf.enums', 'elftools.elf.segments', 'elftools.elf.sections', 'elftools.elf.gnuversions', 'elftools.elf.relocation', 'elftools.elf.descriptions', 'elftools.elf.constants', 'elftools.dwarf.dwarfinfo', 'elftools.dwarf.descriptions', 'elftools.dwarf.constants', 'elftools.dwarf.callframe', 'regex', 'timeit', 'queue', 'ctypes', 'multiprocessing', 'threading', 'json', 'sqlite3', 'urllib.parse', 'urllib.request', 'urllib.error', 'http.client', 'tempfile', 'contextlib', 'webbrowser', 'statistics', 'pathlib', 'serial', 'serial.tools', 'serial.tools.list_ports', 'textwrap', 'packaging', 'packaging.version', 'win32api', 'win32con', 'win32file'],
    replacePaths = [],
    compress     = True,
    optimizeFlag = True,
    path         = ['C:\\Seafile\\EMBEETLE IDE\\embeetle\\beetle_core\\to_exe', 'C:\\Seafile\\EMBEETLE IDE\\embeetle\\beetle_shared', 'C:\\Python39\\python39.zip', 'C:\\Python39\\DLLs', 'C:\\Python39\\lib', 'C:\\Python39', 'C:\\Python39\\lib\\site-packages', 'C:\\Python39\\lib\\site-packages\\pyelftools-0.27-py3.9.egg', 'C:\\Python39\\lib\\site-packages\\win32', 'C:\\Python39\\lib\\site-packages\\win32\\lib', 'C:\\Python39\\lib\\site-packages\\Pythonwin', 'C:\\Seafile\\EMBEETLE IDE\\embeetle\\beetle_core\\to_exe\\..', 'C:/Users/Gebruiker/embeetle_dist/windows/embeetle/copied_embeetle'],
    targetDir    = 'C:/Users/Gebruiker/embeetle_dist/windows/embeetle/beetle_core',
    zipIncludes  = [],
    silent       = False,
)
kristofmulier commented 3 years ago

Minimal and reproducible example

Hi @marcelotduarte , My colleague Matic Kukovec created a reproducible example to trigger the error. First, you need a very simple hello_world.py file that just spawns a PyQt5 window:

hello_world.py

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5 import QtWidgets, uic

class MainWindow(QtWidgets.QMainWindow):
   count = 0

   def __init__(self, parent = None):
      super(MainWindow, self).__init__(parent)
      self.mdi = QMdiArea()
      self.setCentralWidget(self.mdi)
      bar = self.menuBar()

      file = bar.addMenu("Subwindow")
      file.addAction("window1")
      file.addAction("text1")
      file.addAction("text2")
      file.triggered[QAction].connect(self.click)
      self.setWindowTitle("Multiple window using MDI")

   def click(self, q):
       print ("New sub window")

       if q.text() == "window1":
          MainWindow.count = MainWindow.count+1
          sub = QMdiSubWindow()
          sub.setWidget(QTextEdit())
          sub.setWindowTitle("subwindow"+str(MainWindow.count))
          self.mdi.addSubWindow(sub)
          sub.show()

       if q.text() == "text1":
          self.mdi.cascadeSubWindows()

       if q.text() == "text2":
          self.mdi.tileSubWindows()

def main():
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Next, you need this setup.py file next to hello_world.py:

setup.py

import os
import sys
import platform
import cx_Freeze

builtin_modules = [
    "ctypes",
    "PyQt5",
    "PyQt5.Qsci",
    "PyQt5.QtTest",
    "ctypes",
    "multiprocessing",
    "threading",
]
# Windows specific
if platform.system().lower() == "windows":
    builtin_modules.extend([
        "win32api",
        "win32con",
        "win32file",
    ])

base = "Win32GUI"
python_path = os.path.join(os.path.dirname(sys.executable))
output_path = os.path.join(os.getcwd(), "output")

executables = [
    cx_Freeze.Executable(
        "hello_world.py",
        initScript = None,
        base       = base,
        targetName = "output.exe",
    )
]
search_path = sys.path
freezer = cx_Freeze.Freezer(
    executables,
    includes     = [],
    replacePaths = [],
    compress     = True,
    optimizeFlag = True,
    path         = search_path,
    targetDir    = output_path,
    zipIncludes  = [],
    silent       = False,
)
freezer.Freeze()

Now run the command to start the freeze procedure:

> python setup.py

C:\Python39\lib\site-packages\cx_Freeze\common.py:124: UserWarning: camelCase values is obsolete and will be removed in the next major version -> use the new name 'target_name'
  warnings.warn(
Traceback (most recent call last):
  File "C:\Users\Gebruiker\Downloads\setup.py", line 36, in <module>
    freezer = cx_Freeze.Freezer(
  File "C:\Python39\lib\site-packages\cx_Freeze\freezer.py", line 90, in __init__
    self.includeFiles = process_path_specs(includeFiles)
  File "C:\Python39\lib\site-packages\cx_Freeze\common.py", line 60, in process_path_specs
    for spec in specs:
TypeError: 'NoneType' object is not iterable

There you go. This is the error :-)

marcelotduarte commented 3 years ago

You can workaround this error, using parameters: includeFiles=[] zipIncludes=[]

Later I'll fix this.

marcelotduarte commented 3 years ago

Normally we use setup(), then this error doesn't arises.

kristofmulier commented 3 years ago

Thanks @marcelotduarte , Your suggestion to add includeFiles=[] and zipIncludes=[] worked! The error is gone now. You're awesome!

marcelotduarte commented 3 years ago

PR #945 merged.

marcelotduarte commented 3 years ago

cx_Freeze 6.6 has just been released. Assuming this has been resolved. If you had issues please open a new issue.