Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

using py2exe with wxPython and Matplotlib

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

like image 643
asivolella Avatar asked Jun 27 '11 04:06

asivolella


3 Answers

Try using PyInstaller rather than py2exe. It has full support for wxPython and matplotlib. And it's in active development, unlike py2exe.

like image 80
Velociraptors Avatar answered Oct 19 '22 14:10

Velociraptors


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']
)
like image 43
Kirk Avatar answered Oct 19 '22 12:10

Kirk


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).

like image 43
otterb Avatar answered Oct 19 '22 13:10

otterb