bundle_files = 1 завершается неудачно с py2exe с использованием matplotlib - PullRequest
5 голосов
/ 25 января 2011

Я пытаюсь создать отдельное приложение, использующее py2exe, которое зависит от matplotlib и numpy. Код приложения таков:

import numpy as np
import pylab as plt

plt.figure()
a = np.random.random((16,16))
plt.imshow(a,interpolation='nearest')
plt.show()

Код установки для py2exe (изменен с http://www.py2exe.org/index.cgi/MatPlotLib) таков:

from distutils.core import setup
import py2exe
import sys

sys.argv.append('py2exe')

opts = {
    'py2exe': {"bundle_files" : 3,
               "includes" : [ "matplotlib.backends",  
                            "matplotlib.backends.backend_qt4agg",
                            "pylab", "numpy", 
                            "matplotlib.backends.backend_tkagg"],
                'excludes': ['_gtkagg', '_tkagg', '_agg2', 
                            '_cairo', '_cocoaagg',
                            '_fltkagg', '_gtk', '_gtkcairo', ],
                'dll_excludes': ['libgdk-win32-2.0-0.dll',
                            'libgobject-2.0-0.dll']
              }
       }

setup(console=[{"script" : "matplotlib_test.py"}], 
                            zipfile=None,options=opts)

Теперь, когда bundle_files установлен = 3 или отсутствует, все работает нормально, но полученный exe-файл не может быть распространен на компьютер, который не настроен с той же версией Python и т. Д. Если я установил bundle_files = 1, он создает достаточно большой исполняемый файл, в котором должно быть все в комплекте, но он не запускается локально или не распространяется. В этом случае я создаю все на компьютере с Windows 7 с Python 2.6.6 и пытаюсь работать локально и на компьютере с XP с установленным Python 2.6.4.

Ошибки, которые я получаю при работе на компьютере с XP, кажутся странными, поскольку без комплектации я не получаю ошибок на Win 7. При связывании Win 7 не сообщает информацию о трассировке, поэтому я не могу быть уверен, что ошибки совпадают , В любом случае, вот сообщение об ошибке на XP:

Traceback (most recent call last):
  File "matplotlib_test.py", line 2, in <module>
  File "zipextimporter.pyc", line 82, in load_module
  File "pylab.pyc", line 1, in <module>
  File "zipextimporter.pyc", line 82, in load_module
  File "matplotlib\__init__.pyc", line 709, in <module>
  File "matplotlib\__init__.pyc", line 627, in rc_params
  File "matplotlib\__init__.pyc", line 565, in matplotlib_fname
  File "matplotlib\__init__.pyc", line 240, in wrapper
  File "matplotlib\__init__.pyc", line 439, in _get_configdir
RuntimeError: Failed to create C:\Documents and Settings\mnfienen/.matplotlib; c
onsider setting MPLCONFIGDIR to a writable directory for matplotlib configuratio
n data

Большое спасибо заранее, если кто-нибудь может указать мне направление, которое исправит это!

РЕДАКТИРОВАТЬ 1:

Я последовал совету Уильяма и исправил проблему с MPLCONFIGDIR, но теперь получаю новую ошибку:

:Traceback (most recent call last):
  File "matplotlib\__init__.pyc", line 479, in _get_data_path
RuntimeError: Could not find the matplotlib data files

РЕДАКТИРОВАТЬ 2: Я исправил проблему с файлами данных, используя:

 data_files=matplotlib.get_py2exe_datafiles()

Это приводит к новой ошибке:

Traceback (most recent call last):
  File "matplotlib_test.py", line 5, in <module>
    import matplotlib.pyplot as plt
  File "matplotlib\pyplot.pyc", line 78, in <module>
  File "matplotlib\backends\__init__.pyc", line 25, in pylab_setup
ImportError: No module named backend_wxagg

Ответы [ 3 ]

2 голосов
/ 20 февраля 2011

У меня была такая же проблема. Я думаю, что проблема была вызвана pylab в matplotlib, py2exe, похоже, испытывал проблемы с поиском и получением всех серверных частей, связанных с pylab.

Я обошел проблему, изменив все мои встроенные графики на использование matplotlib.figure вместо pylab. Вот простой пример того, как построить график с помощью matplotlib.figure:

import matplotlib.figure as fg
import numpy as np
fig = fg.Figure()
ax = fig.add_subplot(111)
lines = ax.plot(range(10), np.random.randn(10), range(10), np.random.randn(10))

Вы не можете напрямую использовать fig.show (), но его можно встраивать в GUI. Я использовал Tkinker:

canvas = FigureCanvasTkAgg(fig, canvas_master)
canvas.show()
1 голос
/ 25 января 2011

Ну, Миша Файенен, я думаю, что, похоже, не удается записать в вашу пользовательскую папку, которую вы, вероятно, уже знали. Просто удар в темноте, но пытались ли вы проверить, что произойдет, если вы последуете совету и измените MPLCONFIGDIR на что-то более простое (например, "C: \ matlibplotcfg \")?

0 голосов
/ 05 марта 2011

Существует два способа решения проблемы.

1.- В вашем файле matplotlib.rc используйте:

backend: TkAgg

2.- в качестве альтернативы, в вашем setup.py добавляется ключ «include»:

«matplotlib.backends.backend_wxagg»

в обоих случаях создает тестовый рисунок в Python 2.6Windows XP

...