pyinstall and matplotlib
John Henry
john106henry at hotmail.com
Sun Feb 17 12:39:30 EST 2008
Anybody willing to help?
On Feb 14, 11:17 am, John Henry <john106he... at hotmail.com> wrote:
> Thank you for the response. I am having trouble using the script. I
> am assuming the TUI is the application this script was developed for
> and did my best to replace that with the name of my own.
>
> To make things simple, let's say we take one of the sample matplotlib
> program MULTICOLOR.PY and place that in a directory by itself. I have
> attached the modified script below. Notice that I commented out the
> "import TUI.Version" and replaced TUI.Version.VersionStr with some
> arbitrary number. I have to create a directroy "dest" before running
> it.
>
> When I run this script, there is no error message. Just:
>
> running install
> running build
> running install_data
>
> and then there is an empty directory "MULTICOLOR_2.31_Windows" created
> and then nothing else.
>
> #=================================
> from distutils.core import setup
> import os
> import sys
> import matplotlib
> import py2exe
>
> # The following code is necessary for py2exe to find win32com.shell.
> # Solution from <http://starship.python.net/crew/theller/moin.cgi/
> WinShell>
>
> import win32com
> import py2exe.mf as modulefinder
>
> for pth in win32com.__path__[1:]:
> modulefinder.AddPackagePath("win32com", pth)
> for extra in ["win32com.shell"]:
> __import__(extra)
> m = sys.modules[extra]
> for pth in m.__path__[1:]:
> modulefinder.AddPackagePath(extra, pth)
>
> tuiRoot = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
> roRoot = os.path.join(tuiRoot, "ROPackage")
> sys.path = [tuiRoot, roRoot] + sys.path
>
> #import TUI.Version
>
> mainProg = os.path.join(tuiRoot, "multicolor.py")
>
> NDataFilesToPrint = 0 # number of data files to print, per directory
>
> def addDataFiles(dataFiles, fromDir, toSubDir=None,
> inclHiddenDirs=False):
> """
> Find data files and format data for the data_files argument of
> setup.
>
> In/Out:
> - dataFiles: a list to which is appended zero or more of these
> elements:
> [subDir, list of paths to resource files]
>
> Inputs:
> - fromDir: path to root directory of existing resource files
> - toSubDir: relative path to resources in package;
> if omitted then the final dir of fromDir is used
> - inclHiddenDirs: if True, the contents of directories whose
> names
> start with "." are included
>
> Returns a list of the following elements:
> """
> lenFromDir = len(fromDir)
> if toSubDir == None:
> toSubDir = os.path.split(fromDir)[1]
> for (dirPath, dirNames, fileNames) in os.walk(fromDir):
> if not inclHiddenDirs:
> numNames = len(dirNames)
> for ii in range(numNames-1, -1, -1):
> if dirNames[ii].startswith("."):
> del(dirNames[ii])
> if not dirPath.startswith(fromDir):
> raise RuntimeError("Cannot deal with %r files; %s does not
> start with %r" %\
> (resBase, dirPath, fromDir))
> toPath = os.path.join(toSubDir, dirPath[lenFromDir+1:])
> filePaths = [os.path.join(dirPath, fileName) for fileName in
> fileNames]
> dataFiles.append((toPath, filePaths))
>
> # Add resources
> dataFiles = []
> # TUI resources
> for resBase in ("Help", "Scripts", "Sounds"):
> toSubDir = os.path.join("MULTICOLOR", resBase)
> fromDir = os.path.join(tuiRoot, toSubDir)
> addDataFiles(dataFiles, fromDir, toSubDir)
> # RO resources
> for resBase in ("Bitmaps",):
> toSubDir = os.path.join("RO", resBase)
> fromDir = os.path.join(roRoot, toSubDir)
> addDataFiles(dataFiles, fromDir, toSubDir)
>
> # Add tcl snack libraries
> pythonDir = os.path.dirname(sys.executable)
> snackSubDir = "tcl\\snack2.2"
> snackDir = os.path.join(pythonDir, snackSubDir)
> addDataFiles(dataFiles, snackDir, snackSubDir)
>
> # Add matplotlib's data files.
> matplotlibDataPath = matplotlib.get_data_path()
> addDataFiles(dataFiles, matplotlibDataPath, "matplotlibdata")
>
> if NDataFilesToPrint > 0:
> print "\nData files:"
> for pathInfo in dataFiles:
> print pathInfo[0]
> nFiles = len(pathInfo[1])
> for resPath in pathInfo[1][0:NDataFilesToPrint]:
> print " ", resPath
> if nFiles > NDataFilesToPrint:
> print " ...and %d more" % (nFiles - NDataFilesToPrint)
>
> versDate = "2.31" # TUI.Version.VersionStr
> appVers = versDate.split()[0]
> distDir = "MULTICOLOR_%s_Windows" % (appVers,)
>
> inclModules = [
> # "email.Utils", # needed for Python 2.5.0
> ]
> # packages to include recursively
> inclPackages = [
> "MULTICOLOR",
> "RO",
> "matplotlib",
> "dateutil", # required by matplotlib
> "pytz", # required by matplotlib
> # "matplotlib.backends",
> # "matplotlib.numerix",
> # "encodings",
> # "numpy",
> # "email", # needed for Python 2.5
> ]
>
> setup(
> options = dict(
> py2exe = dict (
> dll_excludes = [
> # the following are for matplotlib 0.87:
> "libgdk_pixbuf-2.0-0.dll",
> "libgobject-2.0-0.dll",
> "libgdk-win32-2.0-0.dll",
> "wxmsw26uh_vc.dll",
> ],
> excludes = [ # modules to exclude
> "_gtkagg",
> "_wxagg",
> ],
> #includes = inclModules,
> packages = inclPackages,
> )
> ),
> windows=[ # windows= for no console, console= for console
> dict(
> script = mainProg,
> dest_base = "MULTICOLOR",
> icon_resources = [(1, "python.ico")],
> ),
> ],
> data_files = dataFiles,
> )
>
> # rename dist to final directory name
> os.rename("dist", distDir)
>
> On Feb 13, 10:07 am, "Russell E. Owen" <ro... at cesmail.net> wrote:
>
> > In article
> > <3144e444-3542-4550-a280-ff15da8be... at l16g2000hsh.googlegroups.com>,
> > John Henry <john106he... at hotmail.com> wrote:
>
> > > On Feb 9, 2:53 pm, John Henry <john106he... at hotmail.com> wrote:
> > > > Has anybody been able to create an exe of their python applications
> > > > involving matplotlib using pyinstall (ver 1.3)? I am getting a:
>
> > > > RuntimeError: Could not find the matplotlib data files
>
> > > > when I attempt to run the exe created.
>
> > > > In searching the web, it appears this is an issue when others tried to
> > > > use py2exe as well. Unfortunately, the few hits I saw doesn't include
> > > > enough details to inspire me as to what I should be doing in my
> > > > pyinstall .spec file.
>
> > > > Does anybody has an example or information about this?
>
> > > > Thanks,
>
> > > Well, looks like nobody has an answer to this question.
>
> > > How'bout py2exe or other ways of creating exe files out of matplotlib
> > > projects? Has anybody been able to do that? (I am cross-posting
> > > these messages to the matploblib mailing list).
>
> > For py2exe I have appended a setup script I use to bundle an application
> > that includes matplotlib. I am no Windows expert and there are probably
> > better ways to do it, but it does work. I have made no attempt to strip
> > out extra stuff.
>
> > (As for pyinstaller:a year or so ago I tried to use it to make a bundled
> > *unix* version of my app. If that had worked I'd have considered trying
> > to use it for Windows as well. But after a lot of experimenting I was
> > never able to get anything even close to functional. Maybe it's better
> > now.)
>
> > -- Russell
>
> > from distutils.core import setup
> > import os
> > import sys
> > import matplotlib
> > import py2exe
>
> > # The following code is necessary for py2exe to find win32com.shell.
> > # Solution from
> > <http://starship.python.net/crew/theller/moin.cgi/WinShell>
> > import win32com
> > import py2exe.mf as modulefinder
> > for pth in win32com.__path__[1:]:
> > modulefinder.AddPackagePath("win32com", pth)
> > for extra in ["win32com.shell"]:
> > __import__(extra)
> > m = sys.modules[extra]
> > for pth in m.__path__[1:]:
> > modulefinder.AddPackagePath(extra, pth)
>
> > tuiRoot = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
> > roRoot = os.path.join(tuiRoot, "ROPackage")
> > sys.path = [tuiRoot, roRoot] + sys.path
> > import TUI.Version
> > mainProg = os.path.join(tuiRoot, "runtui.py")
>
> > NDataFilesToPrint = 0 # number of data files to print, per directory
>
> > def addDataFiles(dataFiles, fromDir, toSubDir=None,
> > inclHiddenDirs=False):
> > """Find data files and format data for the data_files argument of
> > setup.
>
> > In/Out:
> > - dataFiles: a list to which is appended zero or more of these
> > elements:
> > [subDir, list of paths to resource files]
>
> > Inputs:
> > - fromDir: path to root directory of existing resource files
> > - toSubDir: relative path to resources in package;
> > if omitted then the final dir of fromDir is used
> > - inclHiddenDirs: if True, the contents of directories whose names
> > start with "." are included
>
> > Returns a list of the following elements:
> > """
> > lenFromDir = len(fromDir)
> > if toSubDir == None:
> > toSubDir = os.path.split(fromDir)[1]
> > for (dirPath, dirNames, fileNames) in os.walk(fromDir):
> > if not inclHiddenDirs:
> > numNames = len(dirNames)
> > for ii in range(numNames-1, -1, -1):
> > if dirNames[ii].startswith("."):
> > del(dirNames[ii])
> > if not dirPath.startswith(fromDir):
> > raise RuntimeError("Cannot deal with %r files; %s does not
> > start with %r" %\
> > (resBase, dirPath, fromDir))
> > toPath = os.path.join(toSubDir, dirPath[lenFromDir+1:])
> > filePaths = [os.path.join(dirPath, fileName) for fileName in
> > fileNames]
> > dataFiles.append((toPath, filePaths))
>
> > # Add resources
> > dataFiles = []
> > # TUI resources
> > for resBase in ("Help", "Scripts", "Sounds"):
> > toSubDir = os.path.join("TUI", resBase)
> > fromDir = os.path.join(tuiRoot, toSubDir)
> > addDataFiles(dataFiles, fromDir, toSubDir)
> > # RO resources
> > for resBase in ("Bitmaps",):
> > toSubDir = os.path.join("RO", resBase)
> > fromDir = os.path.join(roRoot, toSubDir)
> > addDataFiles(dataFiles, fromDir, toSubDir)
>
> > # Add tcl snack libraries
> > pythonDir = os.path.dirname(sys.executable)
> > snackSubDir = "tcl\\snack2.2"
> > snackDir = os.path.join(pythonDir,
>
> ...
>
> read more »
More information about the Python-list
mailing list