我正在尝试从使用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
答案 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
)