使用py2exe与wxPython和Matplotlib

时间:2011-06-27 04:34:47

标签: windows-xp wxpython matplotlib py2exe

我正在尝试从使用wxPython和Matplotlib的python脚本生成.exe文件,看起来似乎不可能。

我正在进行的导入(与Matplotlib相关)如下:

from numpy import *
import matplotlib
matplotlib.interactive(True)
matplotlib.use("WXAgg")
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigCanvas
from matplotlib.ticker import MultipleLocator

这是我正在尝试使用的setup.py文件:

from distutils.core import setup
import py2exe
import matplotlib

opts = {
'py2exe': {"bundle_files" : 3,
           "includes" : [ "matplotlib", 
            "matplotlib.backends",  
            "matplotlib.backends.backend_wxagg",
                        "numpy", 
                        "matplotlib.ticker",
                        "matplotlib.figure", "_wxagg"],
            'excludes': ['_gtkagg', '_tkagg', '_agg2', 
                        '_cairo', '_cocoaagg',
                        '_fltkagg', '_gtk', '_gtkcairo', ],
            'dll_excludes': ['libgdk-win32-2.0-0.dll',
                        'libgobject-2.0-0.dll']
          }
   }

setup(


  windows=[{'script':'starHunter.py', 'icon_resources':[(1, 'icon.ico')]}],

  data_files=matplotlib.get_py2exe_datafiles(),

  options=opts,

  zipfile=None
)

在尝试运行.exe文件后,我总是得到“找不到matplotlib数据文件”,顺便说一句,这个文件已成功创建。

其他信息:我在Windows XP上使用Python 2.6,Matplotlib 0.99.3,wxPython 2.8.11.0

提前致谢。 任何帮助将不胜感激!

干杯, Andressa Sivolella

4 个答案:

答案 0 :(得分:9)

尝试使用PyInstaller而不是py2exe。它完全支持wxPython和matplotlib。与py2exe不同,它正在积极开发中。

答案 1 :(得分:1)

matplotlib.get_py2exe_datafiles()存在许多问题,就像它工作时一样方便。指定要使用的后端也是一个好主意。这是我最近使用的matplotlib导入工具:

from distutils.core import setup
import py2exe
from glob import glob

import matplotlib       #Import then use get_py2exe_datafiles() to collect numpy datafiles.
matplotlib.use('wxagg') #Specify matplotlib backend. tkagg must still be included else error is thrown.

data_files = [
            ("Stuff", glob(r'C:\ProjectFolder\Stuff\*.*')) 
            ,("dlls", glob(r'C:\ProjectFolder\dlls\*.dll'))  
            ,("pyds", glob(r'C:\ProjectFolder\pyds\*.pyd')) # py2exe specified pyd's 
            ]
# Extend the tuple list because matplotlib returns a tuple list.      
data_files.extend(matplotlib.get_py2exe_datafiles())  #Matplotlib - pulls it's own files

options =   {'py2exe':{#'bundle_files': 1,                                 # Bundle files to exe
                        'includes': ["matplotlib.backends.backend_tkagg"]  # Specifically include missing modules
                        ,'excludes': ['_gtkagg', 'tkagg']                  # Exclude dependencies. Reduce size.
                      }
            }   

setup(
name='ProjectName'
,options = options  
,data_files=data_files
,console=['projectname.py']
)

答案 2 :(得分:1)

对于简单测试,您只需将'site-packages \ matplotlib'中的'mpl-data'文件夹复制到您的app文件夹即可。据我所知,'mpl-data'不能捆绑到单个可执行文件中,因此必须将其作为文件夹包含在二进制发行版中。

我通过GUI2Exe使用py2exe并且可以冻结我使用matplotlib + numpy / scipy + wx的应用程序(显然是wxagg后端)。我不需要包含_tkagg(在GUI2Exe默认设置中明确排除了对我有效)。

答案 3 :(得分:0)

Py2exe文档解释了问题的根源并提供了解决方案。它对我有用。 (matplotlib版本1.1.0,Python 2.7)

http://www.py2exe.org/index.cgi/MatPlotLib

由于我没有权利评论或评估其他答案,我必须自己写一个。 Kirk的答案对我来说是最有价值的帮助。 PyInstaller可能是一种解决方法(尚未测试),但绝对不是解决问题的技术方案!

from distutils.core import setup
import py2exe
from distutils.filelist import findall
import os
import matplotlib
matplotlibdatadir = matplotlib.get_data_path()
matplotlibdata = findall(matplotlibdatadir)
matplotlibdata_files = []
for f in matplotlibdata:
    dirname = os.path.join('matplotlibdata', f[len(matplotlibdatadir)+1:])
    matplotlibdata_files.append((os.path.split(dirname)[0], [f]))


setup(
    console=['test.py'],
    options={
             'py2exe': {
                        'includes': ["sip", "PyQt4.QtGui"],
                        'packages' : ['matplotlib', 'pytz'],
                        'excludes': ['_gtkagg', '_tkagg']
                       }
            },
    data_files=matplotlibdata_files
)