Dans notre cas, la commande python setup.py --freeze bdist_msi renvoie cette erreur :

Traceback (most recent call last):
  File "setup.py", line 549, in <module>
    sys.exit(main())
  File "setup.py", line 545, in main
    NuxeoDriveSetup(attribs)
  File "setup.py", line 536, in __init__
    **freeze_options
  File "nx_cx_Freeze/__init__.py", line 173, in setup
    cx_setup(**attrs)
  File "/site-packages/cx_Freeze/dist.py", line 362, in setup
    distutils.core.setup(**attrs)
  File "/distutils/core.py", line 151, in setup
    dist.run_commands()
  File "/distutils/dist.py", line 953, in run_commands
    self.run_command(cmd)
  File "/distutils/dist.py", line 972, in run_command
    cmd_obj.run()
  File "/site-packages/esky/bdist_esky/__init__.py", line 312, in run
    self._run()
  File "nx_esky/__init__.py", line 61, in _run
    self._run_freeze_scripts()
  File "/site-packages/esky/bdist_esky/__init__.py", line 345, in _run_freeze_scripts
    self.freezer_module.freeze(self)
  File "/site-packages/esky/bdist_esky/f_cxfreeze.py", line 71, in freeze
    f.Freeze()
  File "/site-packages/cx_Freeze/freezer.py", line 610, in Freeze
    self.compress, self.copyDependentFiles)
  File "/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

Malheureusement, l'exception n'aide pas vraiment. L'erreur se situe au niveau de path = os.pathsep.join([origPath] + module.parent.path, il faudrait donc savoir de quel module il s'agit.

Solution

Un moyen simple de déboguer le bousin est d'utiliser ipdb :

In [1]: pdb
Automatic pdb calling has been turned ON

In [2]: run setup.py --freeze bdist_msi
# ... + exception

L'exception nous envoie directement dans ipdb, affichons la variable qui nous intéresse :

ipdb> module
<Module name='collections._weakref', file='_weakref'>

Par chance, nous n'en avons pas besoin, il suffit de l'ajouter aux modules exclus dans le fichier setup.py :

excludes = [
    ...,
    'collections._weakref',
]

Répétez l'opération autant de fois que nécessaire.


Sources :

  1. NXDRIVE-1051: Packaging does not work anymore
  2. cx_freeze未能创建exe与熊猫库 - cx_freeze fails to create exe with pandas library

Historique

  • 2018-06-11 : Suppression de la fausse information (merci à Toilal et Knah Tsaeb).