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
Try using PyInstaller rather than py2exe. It has full support for wxPython and matplotlib. And it's in active development, unlike py2exe.
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']
)
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With