Sto provando a creare un'applicazione standalone usando py2exe che dipende da matplotlib e numpy. Il codice dell'applicazione è questo:bundle_files = 1 fallisce con py2exe usando matplotlib
import numpy as np
import pylab as plt
plt.figure()
a = np.random.random((16,16))
plt.imshow(a,interpolation='nearest')
plt.show()
il codice di setup py2exe (modificato da http://www.py2exe.org/index.cgi/MatPlotLib) è presente:
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)
Ora, quando bundle_files è impostato = 3 oppure è assente, tutto funziona benissimo , ma l'exe risultante non può essere distribuito su una macchina che non è configurata con la stessa versione di Python, ecc. Se imposto bundle_files = 1, crea un file exe sufficientemente grande che deve avere tutto in bundle, ma non riesce a girare localmente o distribuito. In questo caso, sto creando tutto su una macchina Windows 7 con Python 2.6.6 e cercando di eseguire localmente e su una macchina XP con installato Python 2.6.4.
Gli errori che ottengo durante l'esecuzione sulla macchina XP sembrano strani perché, senza raggruppamento, non ottengo errori su Win 7. Con il raggruppamento, Win 7 non riporta le informazioni di traceback, quindi non posso essere sicuro che gli errori siano stesso. In ogni caso, ecco il messaggio di errore su 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
Molte grazie in anticipo se qualcuno mi può puntare in una direzione che risolverà questo!
EDIT 1:
ho seguito il consiglio di William e risolto il problema con MPLCONFIGDIR, ma ora ottenere un nuovo errore:
: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: ho risolto il problema dei file di dati utilizzando:
data_files=matplotlib.get_py2exe_datafiles()
Questo porta ad un nuovo errore:
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
Grazie William. Quindi, ho provato a cambiare MPLCONFIGDIR ma era una falsa pista. Risulta che anche il test di base .py non funzionava sulla macchina XP senza MPLCONFIGDIR impostato su un posto scrivibile, ma ora ho un nuovo errore. Vedi modifica nella domanda originale sopra ..... – mishaF
Sembra che questo sia un problema più serio di quanto non sembrasse all'inizio. Per il tuo nuovo errore corrente potresti provare ad aggiungere "matplotlib.backends.backend_tkagg" alla tua lista di include, ma qualcosa mi sta dicendo che c'è una soluzione più semplice e più completa che gira intorno =/ – William
Divertente-ho provato a mettere "matplotlib.backends.backend_tkagg "esclude, ma non include. Sono d'accordo, ho pensato, da qualche parte c'è un pesce più grande da friggere. – mishaF