web-dev-qa-db-fra.com

ImportError: aucun module nommé mpl_toolkits avec maptlotlib 1.3.0 et py2exe

Je ne peux pas comprendre comment être en mesure de l'empaqueter via py2exe maintenant:

J'exécute la commande:

python setup2.py py2exe

via python 2.7.5 et matplotlib 1.3.0 et py2exe 0.6.9 et 0.6.10dev

Cela a fonctionné avec matplotlib 1.2.x

J'ai lu http://www.py2exe.org/index.cgi/ExeWithEggs et essayé d'implémenter les suggestions pour gérer les mpl_toolkits depuis qu'il est devenu un paquet d'espace de noms.

J'essaie également d'obtenir une réponse ici: http://matplotlib.1069221.n5.nabble.com/1-3-0-and-py2exe-regression-td41723.html

L'ajout d'un __init__.py Vide à mpl_toolkits le fait fonctionner, mais ce n'est qu'une solution de contournement au problème.

Quelqu'un peut-il suggérer ce dont j'ai besoin pour que py2exe fonctionne avec mpl_toolkits.axes_grid1 dans matplotlib 1.3.0?:


test_mpl.py est:

from mpl_toolkits.axes_grid1 import make_axes_locatable, axes_size

if __name__ == '__main__':
    print make_axes_locatable, axes_size

setup2.py est:

import py2exe
import distutils.sysconfig
from distutils.core import setup

# attempts to get it to work
import modulefinder
import matplotlib
import mpl_toolkits.axes_grid1
__import__('pkg_resources').declare_namespace("mpl_toolkits")
__import__('pkg_resources').declare_namespace("mpl_toolkits.axes_grid1")
modulefinder.AddPackagePath("mpl_toolkits", matplotlib.__path__[0])
modulefinder.AddPackagePath("mpl_toolkits.axes_grid1", mpl_toolkits.axes_grid1.__path__[0])

# end of attempts to get it to work

options={'py2exe': {'packages' : ['matplotlib', 'mpl_toolkits.axes_grid1', 'pylab', 'zmq'],
                    'includes': ['zmq', 'six'],
                    'excludes': ['_gdk', '_gtk', '_gtkagg', '_tkagg', 'PyQt4.uic.port_v3', 'Tkconstants', 'Tkinter', 'tcl'],
                    'dll_excludes': ['libgdk-win32-2.0-0.dll',
                                     'libgdk_pixbuf-2.0-0.dll',
                                     'libgobject-2.0-0.dll',
                                     'tcl85.dll',
                                     'tk85.dll'],
                    'skip_archive': True },}

setup(console=['test_mpl.py'], options=options)

la sortie est:

running py2exe
*** searching for required modules ***
Traceback (most recent call last):
  File "setup2.py", line 23, in <module>
    setup(console=['test_mpl.py'], options=options)
  File "C:\Python27\lib\distutils\core.py", line 152, 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\site-packages\py2exe\build_exe.py", line 243, in run
    self._run()
  File "C:\Python27\lib\site-packages\py2exe\build_exe.py", line 296, in _run
    self.find_needed_modules(mf, required_files, required_modules)
  File "C:\Python27\lib\site-packages\py2exe\build_exe.py", line 1308, in find_needed_modules
    mf.import_hook(f)
  File "C:\Python27\lib\site-packages\py2exe\mf.py", line 719, in import_hook
    return Base.import_hook(self,name,caller,fromlist,level)
  File "C:\Python27\lib\site-packages\py2exe\mf.py", line 136, in import_hook
    q, tail = self.find_head_package(parent, name)
  File "C:\Python27\lib\site-packages\py2exe\mf.py", line 204, in find_head_package
    raise ImportError, "No module named " + qname
ImportError: No module named mpl_toolkits
15
RuiDC

Il existe une solution de contournement assez simple à ce problème. Recherchez le répertoire à partir duquel mpl_tools est importé et ajoutez simplement un fichier texte vide nommé __init__.py dans ce répertoire. py2exe va maintenant trouver et inclure ce module sans aucune importation spéciale nécessaire dans le fichier d'installation.

Vous pouvez trouver le répertoire mpl_tools en tapant ce qui suit dans une console python:

import importlib
importlib.import_module('mpl_toolkits').__path__

J'ai trouvé la solution ici https://stackoverflow.com/a/11632115/216682 et elle semble s'appliquer aux packages d'espace de noms en général.

19
joelostblom

Ce problème m'est arrivé après avoir mis à jour MacOS vers Sierra depuis El Capitan.

Sudo pip install -U matplotlib

résolu mon problème.

Cette page https://github.com/JuliaPy/PyPlot.jl/issues/294 pourrait également vous aider.

5
Aerin

La plupart des dossiers du répertoire site-packages dans une installation Python sont des packages (ils ont un fichier __init__.py). S'il n'y a pas de fichier __init__.py, alors le package est appelé un - package d'espace de noms. cx_Freeze a une option pour indiquer que mpl_toolkits est un package d'espace de noms, de sorte que les sous-packages peuvent être trouvés.

3
John David Reaver