2011-01-24 5 views
5

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

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, он создает достаточно большой exe-файл, который должен иметь все в комплекте, но он не запускается локально или распределены. В этом случае я создаю все на машине под управлением 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 

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

EDIT 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 

EDIT 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 

ответ

1

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

+0

Благодаря Уильям. Итак, я попытался изменить MPLCONFIGDIR, но это была красная селедка. Оказывается, даже базовый тест .py код не будет запускаться на машине XP без MPLCONFIGDIR, установленной в место для записи, но теперь я получаю новую ошибку. См. Редактирование в исходном вопросе выше ..... – mishaF

+0

Похоже, что это более серьезная проблема, чем казалось сначала. Для вашей новой текущей ошибки вы можете попробовать добавить «matplotlib.backends.backend_tkagg» в свой список включений, но что-то говорит мне, что есть более простое более полное решение, плавающее вокруг =/ – William

+0

Забавно-я попробовал поставить «matplotlib.backends.backend_tkagg «исключает, но не включает. Я согласен, подумал, там где-то есть большая рыба, чтобы жарить. – mishaF

2

У меня была та же проблема. Я думаю, проблема была вызвана 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() непосредственно с этим, но он может быть встроен в ГПИ. Я использовал Tkinker:

canvas = FigureCanvasTkAgg(fig, canvas_master) 
canvas.show() 
0

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

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

backend : TkAgg

2.- в качестве альтернативы, в вашей системе.ру "включает в себя" ключ надстройку:

"matplotlib.backends.backend_wxagg"

оба способа получения тестовой фигуры в Python 2.6, Windows XP

Смежные вопросы