2011-01-24 34 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文件,它必须包含所有的东西,但它无法在本地运行或分布式。在这种情况下,我使用Python 2.6.6在Windows 7计算机上创建了所有内容,并尝试在安装了Python 2.6.4的XP计算机上本地运行。

我在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 

回答

1

好Misha Fienen,我猜这似乎是无法写入您可能已经知道的用户文件夹。只是在黑暗中刺,但你有没有尝试过测试会发生什么,如果你按照建议,并改变MPLCONFIGDIR到一些更基本的东西(如“C:\ matlibplotcfg \”)?

+0

感谢威廉。所以,我尝试改变MPLCONFIGDIR,但它是一个红鲱鱼。事实证明,即使基础测试.py代码不会在未将MPLCONFIGDIR设置为可写位置的XP机器上运行,但现在我得到一个新的错误。请参阅上面原始问题中的编辑..... – mishaF 2011-01-25 03:01:53

2

我有同样的问题。我认为这个问题是由matplotlib中的pylab引起的,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:或者,在你的设置。PY “包括” 键添加:

"matplotlib.backends.backend_wxagg"

两种方式产生的测试图在Python 2.6,Windows XP的