2013-09-03 1 views
11

Я не могу понять, как быть в состоянии упаковать это через py2exe Сейчас:ImportError: Нет модуль с именем mpl_toolkits с maptlotlib 1.3.0 и py2exe

Я бегу команду:

python setup2.py py2exe 

с помощью питона 2.7.5 и 1.3.0 Matplotlib и py2exe 0.6.9 и 0.6.10dev

Это работало с Matplotlib 1.2.x

Я прочитал http://www.py2exe.org/index.cgi/ExeWithEggs и попытался реализовать предложения по обработке mpl_toolkits, поскольку он стал пакетом пространства имен.

Я пытаюсь получить ответ здесь: http://matplotlib.1069221.n5.nabble.com/1-3-0-and-py2exe-regression-td41723.html

Добавление пустой __init__.py к mpl_toolkits делает его работу, но это лишь временное решение проблемы.

Может кто-нибудь предложить, что мне нужно сделать py2exe работу с mpl_toolkits.axes_grid1 в Matplotlib 1.3.0:


test_mpl.py является:

from mpl_toolkits.axes_grid1 import make_axes_locatable, axes_size 

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

Setup2 .py is:

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) 

выход:

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 
+0

вы действительно должны использовать pyinstaller, его лучше там –

+0

Мы намерены перейти к cx_freeze, учитывая, что в отличие от pyinstaller, это py3k совместимо, но py2exe является действующим в этом пространстве – RuiDC

+0

pyinstaller имеет ту же ошибку, cx_Freeze, к сожалению, есть проблемы с некоторыми трюками в numpy 1.7.x. – RuiDC

ответ

3

Большинство папок в каталоге сайта-пакеты в установке Python пакеты (они есть файл __init__.py). Если файл __init__.py отсутствует, пакет называется пакетом пространства имен. cx_Freeze имеет возможность указать, что mpl_toolkits является пакетом пространства имен, поэтому можно найти подпакеты.

+0

спасибо, это был мой предпочтительный маршрут, но, как я упомянул в своих комментариях, cx_Freeze имел проблемы с numpy. – RuiDC

+0

А, я забыл, что ты это написал. Я вернулся к этому вопросу через несколько дней и больше не читал его подробно. Удачи! –

15

Существует довольно простой обходной путь к этой проблеме. Найдите каталог, из которого импортируется mpl_tools, и просто добавьте в этот каталог пустой текстовый файл с именем __init__.py. py2exe теперь найдет и включит этот модуль без специального импорта, необходимого в установочном файле.

Вы можете найти каталог mpl_tools, введя следующую команду в консоли питона:

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

Я нашел решение здесь https://stackoverflow.com/a/11632115/2166823 и, кажется, относится к упаковкам пространства имен в целом.

+0

Я уже добавил, что в моем исходном вопросе: «Добавление пустого __init__.py в mpl_toolkits заставляет его работать, но это только обходной путь к проблеме». – RuiDC

+0

Мой плохой, я прочитал ваш вопрос на форуме списка рассылок matplotlib, а затем разместил обходное решение там и здесь. Не заметил, что вы добавили эту строку здесь. –

+0

Теперь реальный вопрос в том, почему '__init __. Py' не учитывается в первую очередь. Все, что у меня есть до сих пор, - «что-то в пакете пространства имен». – tel

5

Эта проблема произошла со мной после того, как я обновил MacOS до Sierra от El Capitan.

sudo pip install -U matplotlib 

решена моя проблема.

Эта страница https://github.com/JuliaPy/PyPlot.jl/issues/294 может вам помочь.