cx_freeze fails to create exe with pandas library

前端 未结 2 700
别那么骄傲
别那么骄傲 2020-12-19 18:31

Having problems creating exe using cx_freeze with a Pandas library. I have seen lots of others having issues with numPy but I was able to successfully bring in numPy. My big

相关标签:
2条回答
  • 2020-12-19 18:41

    Add the following to your build_exe_options:

    'build_exe': {
        'excludes': ['boto.compat.sys',
                     'boto.compat._sre',
                     'boto.compat._json',
                     'boto.compat._locale',
                     'boto.compat._struct',
                     'boto.compat.array'],
    }
    

    I looked at boto/compat.py and did not see a sys module being imported. By excluding the above list of modules, boto/compat.py is still included.

    After excluding 'boto.compat.sys' and 'boto.compat._sre', I got the following error:

    Traceback (most recent call last):
      File "setup.py", line 31, in <module>
        executables=executables
      File "/Users/king/virtual_envs/py27/lib/python2.7/site-packages/cx_Freeze/dist.py", line 362, in setup
        distutils.core.setup(**attrs)
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/core.py", line 151, in setup
        dist.run_commands()
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py", line 953, in run_commands
        self.run_command(cmd)
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py", line 972, in run_command
        cmd_obj.run()
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/build.py", line 127, in run
        self.run_command(cmd_name)
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/cmd.py", line 326, in run_command
        self.distribution.run_command(command)
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py", line 972, in run_command
        cmd_obj.run()
      File "/Users/king/virtual_envs/py27/lib/python2.7/site-packages/cx_Freeze/dist.py", line 232, in run
        freezer.Freeze()
      File "/Users/king/virtual_envs/py27/lib/python2.7/site-packages/cx_Freeze/freezer.py", line 610, in Freeze
        self.compress, self.copyDependentFiles)
      File "/Users/king/virtual_envs/py27/lib/python2.7/site-packages/cx_Freeze/freezer.py", line 586, in _WriteModules
        path = os.pathsep.join([origPath] + module.parent.path)
    TypeError: can only concatenate list (not "NoneType") to list
    

    I ran ipython and then typed:

    In [1]: pdb
    Automatic pdb calling has been turned ON
    
    In [2]: run setup.py build
    

    To get access to module from module.parent.path:

    ipdb> module
    <Module name='boto.compat._json', file='/Users/king/virtual_envs/py27/lib/python2.7/lib-dynload/_json.so'>
    

    NOTE: _json.so is the built in json module. This means putting it in the includes specifically should include it. I did not since other packages caused cx_freeze to pick it up automatically. Excluding 'boto.compat._json' did the trick.

    I repeated this until I the whole thing built. I confirmed all base modules were picked up by cx_freeze (_sre, _json, _locale, _struct, array) so I did not need to add them manually to includes.

    So, your updated script will look like:

    from cx_Freeze import setup, Executable
    build_exe_options = {
    "includes": ['numpy', 'pandas'],
    "packages": [],
    'excludes' : ['boto.compat.sys',
                  'boto.compat._sre',
                  'boto.compat._json',
                  'boto.compat._locale',
                  'boto.compat._struct',
                  'boto.compat.array'],
    "include_files": []}
    
    setup(
        name = "appName",
        version = "0.1",
        description = "",
        author = "Dengar",
        options = {"build_exe": build_exe_options},
        executables = [Executable("appName.py")]
    )
    
    0 讨论(0)
  • 2020-12-19 18:47

    The following should help you get over this problem (and may lead you to the next one of missing dependencies ;) )

    Checking the code for freeze.py, there is a case that is not checked, so I made the following changes to freezer.py:

    line 600, from

        try:
            if module.parent is not None:
                path = os.pathsep.join([origPath] + module.parent.path)
                os.environ["PATH"] = path
            self._CopyFile(module.file, target, copyDependentFiles)
        finally:
            os.environ["PATH"] = origPath
    

    to:

        try:
            if module.parent is not None:
                if module.parent.path is not None:
                    path = os.pathsep.join([origPath] + module.parent.path)
                    os.environ["PATH"] = path
                    self._CopyFile(module.file, target, copyDependentFiles)
                else:
                    path = os.pathsep.join([origPath, os.path.dirname(module.parent.file)])
                    os.environ["PATH"] = path
                    print '========================================================'
        finally:
            os.environ["PATH"] = origPath
    
    0 讨论(0)
提交回复
热议问题