pyinstall and matplotlib

Stef Mientki stef.mientki at gmail.com
Sun Feb 17 20:50:38 CET 2008


hi John,

John Henry wrote:
> Anybody willing to help?
>   
I struggled the past few days with the same problem,
and with the help of Werner Bruhin (wxPython list) I found a solution.
I had 2 problems:
  - not finding mpl datapath
  - matplotlib insisted on installing backends that were distorted on my 
system

The first problem was solved with the following script:
it has some special parts
- remove the distro and build directories before running setup
- a special matplot part, ensuring mpl-data is copied and installed
- a lot of excludes for matplotlib ( which doesn't seem to work :-( )

Kill_Distro = True
MatPlotLib_Wanted = True

from distutils.core import setup
import py2exe
import sys
subdirs = [ '..\\P24_support', '..\\P24_pictures', 
'..\\P24_Lib_Extensions' ]
for subdir in subdirs:
  if not ( subdir in sys.path) : sys.path.append ( subdir )

from file_support import *

import shutil
import glob


# ***********************************************************************
# Some suggests that old build/dist should be cleared
# ***********************************************************************
dist_paths =  [ 'D:\\Data_Python\\P24_PyLab_Works\\build',
                'D:\\Data_Python\\P24_PyLab_Works\\dist' ]
for path in dist_paths :
  if File_Exists ( path ) :
    shutil.rmtree ( path )
# ***********************************************************************



# ***********************************************************************
# ***********************************************************************
data_files = []
packages = []
includes = []
excludes = []
dll_excludes = []
data_files.append ( ( '', glob.glob ( 'templates_*.*' ) ) )



# ***********************************************************************
# For MatPlotLib
# ***********************************************************************
if MatPlotLib_Wanted :
  import matplotlib

  includes.append ( 'matplotlib.numerix.random_array' )

  packages.append ( 'matplotlib' )
  packages.append ( 'pytz' )

  data_files.append ( ( r'mpl-data', glob.glob (
    r'P:\\Python\\Lib\\site-packages\\matplotlib\\mpl-data\\*.*' )))
  data_files.append ( ( r'mpl-data', glob.glob (
    
r'P:\\Python\\Lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc' )))
  data_files.append ( ( r'mpl-data\\images', glob.glob (
    r'P:\\Python\\Lib\\site-packages\\matplotlib\\mpl-data\\images\\*.*' )))
  data_files.append ( ( r'mpl-data\\fonts\\afm', glob.glob (
    
r'P:\\Python\\Lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\*.*' )))
  data_files.append ( ( r'mpl-data\\fonts\\pdfcorefonts', glob.glob (
    
r'P:\\Python\\Lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\*.*' 
)))
  data_files.append ( ( r'mpl-data\\fonts\\ttf', glob.glob (
    
r'P:\\Python\\Lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\*.*' )))

  excludes.append ( '_gtkagg')
  excludes.append ( '_tkagg' )
  excludes.append ( '_agg2'  )
  excludes.append ( '_cairo' )
  excludes.append ( '_cocoaagg' )
  excludes.append ( '_fltkagg' )
  excludes.append ( '_gtk' )
  excludes.append ( '_gtkcairo')
  excludes.append ( 'backend_qt' )
  excludes.append ( 'backend_qt4')
  excludes.append ( 'backend_qt4agg' )
  excludes.append ( 'backend_qtagg' )
  excludes.append ( 'backend_cairo' )
  excludes.append ( 'backend_cocoaagg' )
  excludes.append ( 'Tkconstants' )
  excludes.append ( 'Tkinter' )
  excludes.append ( 'tcl' )
  excludes.append ( "_imagingtk" )
  excludes.append ( "PIL._imagingtk" )
  excludes.append ( "ImageTk" )
  excludes.append ( "PIL.ImageTk" )
  excludes.append ( "FixTk" )
 
  dll_excludes.append ( 'libgdk-win32-2.0-0.dll' )
  dll_excludes.append ( 'libgdk_pixbuf-2.0-0.dll' )
  dll_excludes.append ( 'libgobject-2.0-0.dll')
  dll_excludes.append ( 'tcl84.dll' )
  dll_excludes.append ( 'tk84.dll' )
  dll_excludes.append ( 'tclpip84.dll' )
# ***********************************************************************


# seems not to be found (imported in brick.py)
includes.append ( 'PyLab_Works_properties' )

# ***********************************************************************
# ***********************************************************************



# If run without args, build executables, in quiet mode.
if len(sys.argv) == 1:
    sys.argv.append("py2exe")

setup (
  windows = ['PyLab_Works.py']  ,
  options = {
   'py2exe' : {
      'includes'     : includes,
      'excludes'     : excludes,
      'dll_excludes' : dll_excludes,
      'packages'     : packages,
               }},
  data_files = data_files
      )

import subprocess
result = subprocess.call (
  [ 'P:\Program Files\Inno Setup 4\ISCC.exe',
    'D:\Data_Python\P24_PyLab_Works\PyLab_Works.iss'])

if (result==0) and Kill_Distro :
  for path in dist_paths :
    if File_Exists ( path ) :
      shutil.rmtree ( path )


Thé essential issue is not to use pylab to do the imports for you,
but perform your own imports,
this might be a lot of work: in my case the import looks like this
(I don't include numerix, because I use numpy),
so in my program to distribute, I use this :

import matplotlib
matplotlib.use('WXAgg')
from matplotlib.backends.backend_wxagg \
  import Toolbar,  FigureManager
from matplotlib.backends.backend_wxagg \
  import FigureCanvasWxAgg as FigureCanvas
from matplotlib        import rcParams, mlab, cm
from matplotlib.mlab   import meshgrid
from matplotlib.figure import Figure
from matplotlib.axes   import Subplot


hope this might help you somewhat,
cheers,
Stef



More information about the Python-list mailing list