【问题标题】:Py2Exe and MatPlotLib: Plot won't AppearPy2Exe 和 MatPlotLib:绘图不会出现
【发布时间】:2011-11-28 20:09:22
【问题描述】:

我有一个使用 matplotlib 的工作 Python 2.6 代码,并希望从中获得一个工作 exe。我在完成这项工作时遇到了问题:

最初我收到一个缺少 MSCVP90.dll 的错误,但我下载了该文件并将 .dll 解压缩到工作目录,该错误就消失了。

我有一些关于缺少 tkagg 模块的错误,但我将它添加到异常中并将 matplotlibrc 文件编辑为默认为 WXAgg,然后它就消失了。

exe 正常运行,但在代码末尾应该显示一个绘图,但它没有。剧情是这个节目的主要目标,有这个就好了。

只需运行 python 代码就可以很好地绘制情节。

谁能提供任何建议或见解?

这是我的 setup.py:

from distutils.core import setup
import py2exe
import matplotlib
matplotlib.use('wxagg') # overrule configuration
import pylab


setup(
    console=['test1.py'],
    options={
             'py2exe': {
                        'excludes': ['_gtkagg', '_tkagg', 'backend_tkagg'],
                       }
            },
    data_files=matplotlib.get_py2exe_datafiles(),

)

提前致谢!



好的,我使用 pyinstaller 并将 matplotlibrc 文件恢复到其原始状态,其中 TkAgg 是默认值,并且一切都在我的计算机上运行,​​但是当我尝试在另一台计算机上运行它时,绘图仍然没有出现......

我可以使用 pyinstaller 从一个非常简单的 matplotlib 代码中编译出一个 exe,例如:

from pylab import *
t = arange(0.0, 2.0, 0.01)
s = sin(2*pi*t)
plot(t, s, linewidth=1.0)
show()

但是当我把那个 exe 放到另一台电脑上时,它就不起作用了。

还有其他人遇到过类似的问题吗?有任何想法吗? 谢谢

【问题讨论】:

  • 我对@9​​87654324@ 和matplotlib 从来没有好运。在我看来,pyinstaller 做得更好,而且使用起来更简单(尤其是对于需要 matplotlib 的东西)。 pyinstaller.org

标签: matplotlib py2exe


【解决方案1】:

如果可执行文件在您的计算机上运行但在另一台计算机上无法运行,最可能的问题是缺少一个或多个必需的 dll,而 py2exe 由于许可证问题而无法打包。

这些 dll 通常是

gdiplus.dll
msvcp90.dll

在 exe 运行的计算机中查找它们并将它们复制到发生故障的计算机。 如果exe仍然不起作用,请检查其他dll。 Py2exe 给出了二进制依赖的列表:

*** binary dependencies ***
Your executable(s) also depend on these dlls which are not included,
you may or may not need to distribute them.

Make sure you have the license if you distribute any of them, and
make sure you don't distribute files belonging to the operating system.

   OLEAUT32.dll - C:\Windows\system32\OLEAUT32.dll
   USER32.dll - C:\Windows\system32\USER32.dll
   gdiplus.dll - gdiplus.dll
   SHELL32.dll - C:\Windows\system32\SHELL32.dll
   ole32.dll - C:\Windows\system32\ole32.dll
   RPCRT4.dll - C:\Windows\system32\RPCRT4.dll
   WSOCK32.dll - C:\Windows\system32\WSOCK32.dll
   WINMM.dll - C:\Windows\system32\WINMM.dll
   ADVAPI32.dll - C:\Windows\system32\ADVAPI32.dll
   msvcrt.dll - C:\Windows\system32\msvcrt.dll
   WS2_32.dll - C:\Windows\system32\WS2_32.dll
   WINSPOOL.DRV - C:\Windows\system32\WINSPOOL.DRV
   GDI32.dll - C:\Windows\system32\GDI32.dll
   IMM32.dll - C:\Windows\system32\IMM32.dll
   MSVCP90.dll - C:\Python26\programas\test\MSVCP90.dll
   KERNEL32.dll - C:\Windows\system32\KERNEL32.dll
   ntdll.dll - C:\Windows\system32\ntdll.dll
   COMCTL32.dll - C:\Windows\system32\COMCTL32.dll
   COMDLG32.dll - C:\Windows\system32\COMDLG32.dll
   VERSION.dll - C:\Windows\system32\VERSION.dll

C:\Python26\programas\test>

最后,我成功地得到了一个使用 py2exe 可执行的功能性 matplotlib 程序。我只需要在 setup.py 中添加一个'includes' 并将 WXAgg 设置为 matplotlib.rc 中的后端(使用 Tk,我遇到了与您描述的相同的问题......)。为了让它工作,我必须在原始的 matplotlib.rc 中设置 WXAgg(在 matplotlib/mpl-data 文件夹中)。这是 py2exe 导入的一个(不是用户的 matplotlib 配置目录中的那个)。请务必检查 dist 文件夹中的 .rc 文件。

from distutils.core import setup
import py2exe
import matplotlib

setup(
    console=['test1.py'],
    options={
             'py2exe': {
                        'excludes': ['Tkconstants','Tkinter', 'tcl'],
                        'includes': ['matplotlib.backends.backend_wxagg'],
                       }
            },
    data_files=matplotlib.get_py2exe_datafiles(),

)

【讨论】:

  • 谢谢!我将 matplotlib.rc 中的后端设置为 WXAgg 并使用了您的 setup.py 代码,它可以工作。非常感谢。
  • @user1070048 如果答案有用,您应该投票/选择它作为最佳答案
  • 好吧,有了这个工作,我想将所有内容编译成一个 exe,但使用 'bundle_files': 1 和 zipfile = None 仍然会在 dist 文件夹中删除 mpl-data 文件夹。有没有办法通过将它包含在 library.zip 或其他东西中来摆脱它?
  • 我还没有足够的“经验”来投票,但它很有用
  • @Mike 你得到了你的 dist 中的 matplotlib 文件夹。您不能将其嵌入到您的 py2exe 可执行文件中。如果您只想分发一个文件,您可以将所有内容与Inno Setup 打包在一起(您只需要多出 2 分即可为答案投票;-))
【解决方案2】:

今天我失去了一天的工作,所以......

解决方案是显式包含“FileDialog”模块,因为“six”模块使用它。具体来说,我通过包含sixdateutilFileDialogmatplotlibpylabmatplotlib.backends.backend_tkagg 等解决了我的问题。

祝你好运!

【讨论】:

    猜你喜欢
    • 2012-10-20
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    相关资源
    最近更新 更多