使用 matplotlib 时,bundle_files = 1 因 py2exe 失败

发布于 2024-10-13 10:10:17 字数 2962 浏览 1 评论 0原文

我正在尝试使用 py2exe 创建一个依赖于 matplotlib 和 numpy 的独立应用程序。应用程序的代码是这样的:

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:

我遵循 William 的建议并使用 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

I am trying to create a standalone application using py2exe that depends on matplotlib and numpy. The code of the application is this:

import numpy as np
import pylab as plt

plt.figure()
a = np.random.random((16,16))
plt.imshow(a,interpolation='nearest')
plt.show()

The setup code for py2exe (modified from http://www.py2exe.org/index.cgi/MatPlotLib) is this:

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)

Now, when bundle_files is set = 3 or is absent, all works fine, but the resulting exe cannot be distributed to a machine that is not configured with the same version of Python, etc. If I set bundle_files = 1, it creates a suitably large exe file that must have everything bundled, but it fails to run locally or distributed. In this case, I'm creating everything on a Windows 7 machine with Python 2.6.6 and trying to run locally and on an XP machine with Python 2.6.4 installed.

The errors I get when running on the XP machine seem strange since, without bundling, I get no errors on Win 7. With bundling, Win 7 does not report the traceback information, so I cannot be sure the errors are the same. In any case, here's the error message on 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

Many thanks in advance if anyone can point me in a direction that will fix this!

EDIT 1:

I followed William's advice and fixed the problem with MPLCONFIGDIR, but now get a new 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:
I fixed the data files problem by using:

 data_files=matplotlib.get_py2exe_datafiles()

This leads to a new 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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦明 2024-10-20 10:10:18

好吧,Misha Fienen,我想它似乎无法写入您的用户文件夹,您可能已经知道了。只是在黑暗中刺探,但您是否尝试过测试如果您遵循建议并将 MPLCONFIGDIR 更改为更基本的内容(例如“C:\matlibplotcfg\”)会发生什么?

Well Misha Fienen, I guess it seems to be failing to write to your user folder, which you probably already knew. Just a stab in the dark but have you tried testing what happens if you follow the advice and change MPLCONFIGDIR to something a bit more basic (eg. "C:\matlibplotcfg\")?

天生の放荡 2024-10-20 10:10:18

有两种方法可以解决这个问题。

1.- 在您的 matplotlib.rc 文件中使用:

后端:TkAgg

2.- 或者,在 setup.py 的“includes”键中添加:

“matplotlib.backends.backend_wxagg”

两种方式都会在 Python 2.6、Windows XP 中生成测试图

There are two ways of solving the problem.

1.- In your matplotlib.rc file use:

backend : TkAgg

2.- alternatively, in your setup.py "includes" key add:

"matplotlib.backends.backend_wxagg"

both ways produce the test figure in Python 2.6, windows XP

怂人 2024-10-20 10:10:17

我也有同样的问题。我认为问题是由 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 中。我用了特金克:

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

I had the same problem. I think the problem was caused by pylab in matplotlib, py2exe seemed to have trouble finding and getting all the backends associated with pylab.

I got around the problem by changing all my embedded plots to use matplotlib.figure instead of pylab. Here's a simple example on how to make a plot with 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))

You cannot use fig.show() directly with this, but it can be embedded in GUIs. I used Tkinker:

canvas = FigureCanvasTkAgg(fig, canvas_master)
canvas.show()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文