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 .
See you
Werner
--
John Henry