2011-01-24 20 views
5

Estoy intentando crear una aplicación independiente usando py2exe que depende de matplotlib y numpy. El código de la aplicación es la siguiente:bundle_files = 1 falla 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() 

el código de configuración para py2exe (modificado de http://www.py2exe.org/index.cgi/MatPlotLib) es la siguiente:

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) 

Ahora, cuando bundle_files se establece = 3 o está ausente, todo trabaja muy bien , pero el exe resultante no se puede distribuir a una máquina que no está configurada con la misma versión de Python, etc. Si configuro bundle_files = 1, crea un archivo exe adecuadamente grande que debe tener todo incluido, pero no se ejecuta localmente. o distribuido. En este caso, estoy creando todo en una máquina con Windows 7 con Python 2.6.6 y tratando de ejecutar localmente y en una máquina con XP con Python 2.6.4 instalado.

Los errores que consigo cuando se ejecuta en la máquina XP parecer extraño, ya que, sin empaquetar, me sale ningún error en Windows 7. Con la agrupación, Win 7 no informa de la información de rastreo, por lo que no se puede estar seguro de que los errores son la mismo. En cualquier caso, aquí está el mensaje de error en Windows 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 

Muchas gracias de antemano si alguien me puede apuntar en una dirección que va a arreglar esto!

EDIT 1:

Seguí el consejo de William y solucionado el problema con MPLCONFIGDIR, pero ahora consigo un nuevo error:

: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: He arreglado el problema de los archivos de datos mediante el uso de:

data_files=matplotlib.get_py2exe_datafiles() 

Esto lleva a un nuevo error:

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 

Respuesta

1

Bien Misha Fienen, supongo que parece que no está escribiendo en su carpeta de usuario, que probablemente ya conozca. Solo una puñalada en la oscuridad, pero ¿ha intentado probar lo que sucede si sigue los consejos y cambia MPLCONFIGDIR a algo un poco más básico (por ejemplo, "C: \ matlibplotcfg \")?

+0

Gracias William. Entonces, traté de cambiar MPLCONFIGDIR, pero fue una pista falsa. Resulta que incluso el código .py de la prueba base no se ejecutaría en la máquina XP sin MPLCONFIGDIR configurado en un lugar de escritura, pero ahora aparece un nuevo error. Ver edición en la pregunta original anterior ... – mishaF

+0

Parece que este es un problema más serio de lo que parecía al principio. Para su nuevo error actual, puede intentar agregar "matplotlib.backends.backend_tkagg" a su lista de inclusiones, pero algo me dice que hay una solución más completa y más completa flotando alrededor de =/ – William

+0

Divertido-Intenté poner "matplotlib.backends.backend_tkagg" "en excluye, pero no incluye. Estoy de acuerdo, pensé, que en algún lugar hay un pez más grande para freír. – mishaF

2

Tuve el mismo problema. Creo que el problema fue causado por pylab en matplotlib, py2exe parecía tener problemas para encontrar y obtener todos los backends asociados con pylab.

He solucionado el problema cambiando todos mis gráficos incrustados para utilizar matplotlib.figure en lugar de pylab. He aquí un ejemplo sencillo de cómo hacer una parcela 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)) 

No puede utilizar fig.show() directamente con esto, pero puede ser embebido en interfaces gráficas de usuario. Utilicé Tkinker:

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

Hay dos maneras de resolver el problema.

1.- En uso de archivos matplotlib.rc:

backend : TkAgg

2.- alternativamente, en su configuración.py "incluye" Agregar clave:

"matplotlib.backends.backend_wxagg"

producen en ambos sentidos de la figura de la prueba en Python 2.6, Windows XP

Cuestiones relacionadas