Reputation: 91
I'm trying to generate an .exe file from a python script that uses wxPython and Matplotlib and it looks like to be impossible.
The imports I'm doing (related with Matplotlib) are the following:
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
Here is the setup.py file I'm trying to use:
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
)
I'm always getting "Could not find matplotlib data files" after trying to run the .exe file, which by the way, is successfully created.
Additional information: I'm using Python 2.6, Matplotlib 0.99.3, wxPython 2.8.11.0 on Windows XP
Thanks in advance. Any help will be appreciated!
Cheers, Andressa Sivolella
Upvotes: 9
Views: 5894
Reputation: 1
Py2exe documentation explains the source of the problem and give solutions. It worked for me. (matplotlib version 1.1.0, Python 2.7)
http://www.py2exe.org/index.cgi/MatPlotLib
Since I have no privilege to comment or evaluate other answers, I have to write my own one. Kirk's answer was the most valuable help for me. PyInstaller might be a workaround (have not tested it) but is definitely not the technical solution to the problem !
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
)
Upvotes: 0
Reputation: 2710
For a simply test, you could simply copy 'mpl-data' folder in 'site-packages\matplotlib' to your app folder. As far as I know, 'mpl-data' cannot be bundled into the single executable so this has to be included in your binary distribution as a folder.
I used py2exe via GUI2Exe and could freeze my app that uses matplotlib + numpy/scipy + wx (so obviously wxagg backend). I didn't need to include _tkagg (which is explicitly excluded in GUI2Exe default setting which worked for me).
Upvotes: 1
Reputation: 2030
Try using PyInstaller rather than py2exe. It has full support for wxPython and matplotlib. And it's in active development, unlike py2exe.
Upvotes: 9
Reputation: 159
There are a number of problems with matplotlib.get_py2exe_datafiles(), as convenient as it would be if it worked. It's also a good idea to specify which backend to use. Here's a working matplotlib import I recently used:
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']
)
Upvotes: 1