我正在尝试使用依赖于matplotlib和numpy的py2exe创建一个独立的应用程序。应用程序的代码是:
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
答案 0 :(得分: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(),但它可以嵌入到GUI中。我用过Tkinker:
canvas = FigureCanvasTkAgg(fig, canvas_master)
canvas.show()
答案 1 :(得分:1)
嗯Misha Fienen,我想它似乎没有写到您可能已经知道的用户文件夹。只是在黑暗中刺,但是你试过测试如果你遵循建议并将MPLCONFIGDIR更改为更基本的东西(例如“C:\ matlibplotcfg \”)会发生什么?
答案 2 :(得分:0)
有两种方法可以解决问题。
1.-在matplotlib.rc文件中使用:
后端:TkAgg
2.-或者,在你的setup.py“includes”键中添加:
“matplotlib.backends.backend_wxagg”
两种方式都可以在Python 2.6,Windows XP
中生成测试图