MatPlotLib + Py2exe, backend problems ...

Ok, I know what the problem is. I was using a sample
setup.py posted by Stef and in his setup, he created a
"mpl-data" subdirectory under "dist" to store all of
the data files use by matplotlib. That's why
matplotlib couldn't find it without a set statement.
After changing the name to "matplotlibdata",
everything works.

I also made changes to every one of the matplotlibrc
file I found in the installed copy of matplotlib to
invoke WXAgg - instead of TkAgg.

So for completeless, may be this will benefit other
matplotlib users, here's my py2exe script - tested
using python 2.3, latest wxpython and so forth.

Let say you wish to create an exe of the sample
multicolor.py program. Place multicolor.py in a
test\multicolor directory, and a copy of the following
script, have py2exe installed, and then just run it.
You will end up with a dist subdirectory under
test\multicolor and that's where you'll find
multicolor.exe.

···

#====================
Kill_Distro = True
MatPlotLib_Wanted = True

def File_Exists( path ):
  res=os.path.isdir(path)
  if res==True:
    return res
  return os.path.isfile(path)

from distutils.core import setup
import py2exe
import sys

import os

import shutil
import glob

homedir= r"E:\test\Matplotlib\multicolor"

python = r"c:\Python25" # Name of python directory
if File_Exists(python)==False:
  python = r"c:\Python23" # Name of python directory

#
***********************************************************************
# Some suggests that old build/dist should be cleared
#
***********************************************************************
dist_paths = [ homedir+'\\build',
                homedir+'\\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' )

  def mpl_data_files(destpath, path):
    mpl_data=[]
    for x in glob.glob (path+'\\*.*' ):
      if os.path.isdir(x):
        mpl_data_files(destpath+'\\'+os.path.split(x)[1],
x)
      elif os.path.isfile(x):
        mpl_data.append(x)
    data_files.append ( ( destpath, mpl_data))

  mpl_data_files(r'matplotlibdata',
python+r'\Lib\site-packages\matplotlib\mpl-data')
  
  data_files.append ( ( r'matplotlibdata', glob.glob (
  
python+r'\Lib\site-packages\matplotlib\mpl-data\matplotlibrc'
)))
  data_files.append ( ( r'matplotlibdata\images',
glob.glob (
  
python+r'\Lib\site-packages\matplotlib\mpl-data\images\*.*'
)))
  data_files.append ( ( r'matplotlibdata\fonts\afm',
glob.glob (
  
python+r'\Lib\site-packages\matplotlib\mpl-data\fonts\afm\*.*'
)))
  data_files.append ( (
r'matplotlibdata\fonts\pdfcorefonts', glob.glob (
  
python+r'\Lib\site-packages\matplotlib\mpl-data\fonts\pdfcorefonts\*.*')))
  data_files.append ( ( r'matplotlibdata\fonts\ttf',
glob.glob (
  
python+r'\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 = ['multicolor.py'] ,
    options = {
      'py2exe' : {
      'includes' : includes,
      'excludes' : excludes,
      'dll_excludes' : dll_excludes,
      'packages' : packages,
      }
    },
    data_files = data_files
  )

result=0

#import subprocess
#result = subprocess.call (
# [ 'c:\Program Files\Inno Setup 4\ISCC.exe',
# homedir+'\\multicolor.iss'])

dist_paths = [ homeDir+'\\build',]

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

-----Original Message-----
From: Werner F. Bruhin

[mailto:werner.bruhin@…185…]

Sent: Wednesday, February 20, 2008 5:24 AM
To: kc106_2005-matplotlib@...9...
Cc: matplotlib-users@lists.sourceforge.net
Subject: Re: [Matplotlib-users] MatPlotLib + Py2exe,

backend problems ...

Hi,

kc106_2005-matplotlib@...9... wrote:
> I *finally* got this to work!!!
>
> Thanks to Werner's message, I found the culpit:

the

matplotlibrc file
> copied to the dist directory contains the TkAgg

backend.

All I had to
> do is to change *that* file to say:
>
> backend : WXAgg
>
> Note that it's not the matplotlibrc in the

installed

> copy - but the one in the resulting dist

directory.

>
> In addition, I have to do a:
>
> set MATPLOTLIBDATA=.\mpl-data
>
You shouldn't need to do this. Note in
matplotlib.__init__.py, it looks
at a different folder if it is frozen by py2exe or

py2app or ...:

    # py2exe zips pure python, so still need special

check

    if getattr(sys,'frozen',None):
        path =

os.path.join(os.path.split(sys.path[0])[0],

'matplotlibdata')

So, if you use the sample setup.py I posted a while

ago here

and on the
wxPython list it will create the matplotlibdata

folder in your

distribution (basically a copy of your mpl-data

folder) folder.

> before I start the exe file. I don't know why

this is necessary

> because the code for _get_data_path appears to

look at that

directory
> by default but if I don't set this, it can't find

the data files.

>
> In any event, it works now - after bumping head

for 2

> weeks!
>
Hope the wall wasn't to hard, I always try this or

the wxPython list

after a day or two :wink: .

See you
Werner

--
John Henry