2011-01-24 11 views
5

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 

risposta

1

Bene Misha Fienen, immagino che non riesca a scrivere nella cartella utente, che probabilmente già conoscevi. Solo una pugnalata al buio ma hai provato a testare cosa succede se segui il consiglio e cambia MPLCONFIGDIR in qualcosa di un po 'più di base (ad esempio "C: \ matlibplotcfg \")?

+0

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

+0

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

+0

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

2

Ho avuto lo stesso problema. Penso che il problema sia stato causato da pylab in matplotlib, py2exe sembrava avere problemi a trovare e ottenere tutti i backend associati a pylab.

Ho risolto il problema cambiando tutti i miei grafici incorporati per usare matplotlib.figure invece di pylab. Ecco un semplice esempio su come fare una trama con 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)) 

Non è possibile utilizzare fig.show() direttamente con questo, ma può essere incorporato in GUI. Ho usato Tkinker:

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

Ci sono due modi per risolvere il problema.

1.- Nel vostro uso del file matplotlib.rc:

backend : TkAgg

2.- In alternativa, nella configurazione.py "comprende" key add:

"matplotlib.backends.backend_wxagg"

in entrambe le direzioni produrre la figura di prova in Python 2.6, Windows XP

Problemi correlati