pyinstall and matplotlib

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • John Henry

    pyinstall and matplotlib

    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,
  • John Henry

    #2
    Re: pyinstall and matplotlib

    On Feb 9, 2:53 pm, John Henry <john106he...@h otmail.comwrote :
    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).

    Comment

    • Russell E. Owen

      #3
      Re: pyinstall and matplotlib

      In article
      <3144e444-3542-4550-a280-ff15da8bed0b@l1 6g2000hsh.googl egroups.com>,
      John Henry <john106henry@h otmail.comwrote :
      On Feb 9, 2:53 pm, John Henry <john106he...@h otmail.comwrote :
      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.Ad dPackagePath("w in32com", pth)
      for extra in ["win32com.shell "]:
      __import__(extr a)
      m = sys.modules[extra]
      for pth in m.__path__[1:]:
      modulefinder.Ad dPackagePath(ex tra, pth)

      tuiRoot = os.path.dirname (os.path.dirnam e(os.path.abspa th(__file__)))
      roRoot = os.path.join(tu iRoot, "ROPackage" )
      sys.path = [tuiRoot, roRoot] + sys.path
      import TUI.Version
      mainProg = os.path.join(tu iRoot, "runtui.py" )

      NDataFilesToPri nt = 0 # number of data files to print, per directory

      def addDataFiles(da taFiles, 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(f romDir)[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.startsw ith(fromDir):
      raise RuntimeError("C annot deal with %r files; %s does not
      start with %r" %\
      (resBase, dirPath, fromDir))
      toPath = os.path.join(to SubDir, dirPath[lenFromDir+1:])
      filePaths = [os.path.join(di rPath, fileName) for fileName in
      fileNames]
      dataFiles.appen d((toPath, filePaths))

      # Add resources
      dataFiles = []
      # TUI resources
      for resBase in ("Help", "Scripts", "Sounds"):
      toSubDir = os.path.join("T UI", resBase)
      fromDir = os.path.join(tu iRoot, toSubDir)
      addDataFiles(da taFiles, fromDir, toSubDir)
      # RO resources
      for resBase in ("Bitmaps",) :
      toSubDir = os.path.join("R O", resBase)
      fromDir = os.path.join(ro Root, toSubDir)
      addDataFiles(da taFiles, fromDir, toSubDir)

      # Add tcl snack libraries
      pythonDir = os.path.dirname (sys.executable )
      snackSubDir = "tcl\\snack 2.2"
      snackDir = os.path.join(py thonDir, snackSubDir)
      addDataFiles(da taFiles, snackDir, snackSubDir)

      # Add matplotlib's data files.
      matplotlibDataP ath = matplotlib.get_ data_path()
      addDataFiles(da taFiles, matplotlibDataP ath, "matplotlibdata ")

      if NDataFilesToPri nt 0:
      print "\nData files:"
      for pathInfo in dataFiles:
      print pathInfo[0]
      nFiles = len(pathInfo[1])
      for resPath in pathInfo[1][0:NDataFilesToP rint]:
      print " ", resPath
      if nFiles NDataFilesToPri nt:
      print " ...and %d more" % (nFiles - NDataFilesToPri nt)

      versDate = TUI.Version.Ver sionStr
      appVers = versDate.split( )[0]
      distDir = "TUI_%s_Windows " % (appVers,)

      inclModules = [
      # "email.Util s", # needed for Python 2.5.0
      ]
      # packages to include recursively
      inclPackages = [
      "TUI",
      "RO",
      "matplotlib ",
      "dateutil", # required by matplotlib
      "pytz", # required by matplotlib
      # "matplotlib.bac kends",
      # "matplotlib.num erix",
      # "encodings" ,
      # "numpy",
      # "email", # needed for Python 2.5
      ]

      setup(
      options = dict(
      py2exe = dict (
      dll_excludes = [
      # the following are for matplotlib 0.87:
      "libgdk_pix buf-2.0-0.dll",
      "libgobject-2.0-0.dll",
      "libgdk-win32-2.0-0.dll",
      "wxmsw26uh_vc.d ll",
      ],
      excludes = [ # modules to exclude
      "_gtkagg",
      "_wxagg",
      ],
      #includes = inclModules,
      packages = inclPackages,
      )
      ),
      windows=[ # windows= for no console, console= for console
      dict(
      script = mainProg,
      dest_base = "TUI",
      icon_resources = [(1, "TUI.ico")],
      ),
      ],
      data_files = dataFiles,
      )

      # rename dist to final directory name
      os.rename("dist ", distDir)

      Comment

      • Stef Mientki

        #4
        Re: pyinstall and matplotlib

        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_Want ed = True

        from distutils.core import setup
        import py2exe
        import sys
        subdirs = [ '..\\P24_suppor t', '..\\P24_pictur es',
        '..\\P24_Lib_Ex tensions' ]
        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_Pytho n\\P24_PyLab_Wo rks\\build',
        'D:\\Data_Pytho n\\P24_PyLab_Wo rks\\dist' ]
        for path in dist_paths :
        if File_Exists ( path ) :
        shutil.rmtree ( path )
        # *************** *************** *************** *************** ***********



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



        # *************** *************** *************** *************** ***********
        # For MatPlotLib
        # *************** *************** *************** *************** ***********
        if MatPlotLib_Want ed :
        import matplotlib

        includes.append ( 'matplotlib.num erix.random_arr ay' )

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

        data_files.appe nd ( ( r'mpl-data', glob.glob (
        r'P:\\Python\\L ib\\site-packages\\matpl otlib\\mpl-data\\*.*' )))
        data_files.appe nd ( ( r'mpl-data', glob.glob (

        r'P:\\Python\\L ib\\site-packages\\matpl otlib\\mpl-data\\matplotli brc' )))
        data_files.appe nd ( ( r'mpl-data\\images', glob.glob (
        r'P:\\Python\\L ib\\site-packages\\matpl otlib\\mpl-data\\images\\* .*' )))
        data_files.appe nd ( ( r'mpl-data\\fonts\\af m', glob.glob (

        r'P:\\Python\\L ib\\site-packages\\matpl otlib\\mpl-data\\fonts\\af m\\*.*' )))
        data_files.appe nd ( ( r'mpl-data\\fonts\\pd fcorefonts', glob.glob (

        r'P:\\Python\\L ib\\site-packages\\matpl otlib\\mpl-data\\fonts\\pd fcorefonts\\*.* '
        )))
        data_files.appe nd ( ( r'mpl-data\\fonts\\tt f', glob.glob (

        r'P:\\Python\\L ib\\site-packages\\matpl otlib\\mpl-data\\fonts\\tt f\\*.*' )))

        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_cocoaa gg' )
        excludes.append ( 'Tkconstants' )
        excludes.append ( 'Tkinter' )
        excludes.append ( 'tcl' )
        excludes.append ( "_imagingtk " )
        excludes.append ( "PIL._imagingtk " )
        excludes.append ( "ImageTk" )
        excludes.append ( "PIL.ImageT k" )
        excludes.append ( "FixTk" )

        dll_excludes.ap pend ( 'libgdk-win32-2.0-0.dll' )
        dll_excludes.ap pend ( 'libgdk_pixbuf-2.0-0.dll' )
        dll_excludes.ap pend ( 'libgobject-2.0-0.dll')
        dll_excludes.ap pend ( 'tcl84.dll' )
        dll_excludes.ap pend ( 'tk84.dll' )
        dll_excludes.ap pend ( 'tclpip84.dll' )
        # *************** *************** *************** *************** ***********


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

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



        # 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_Work s\PyLab_Works.i ss'])

        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.back ends.backend_wx agg \
        import Toolbar, FigureManager
        from matplotlib.back ends.backend_wx agg \
        import FigureCanvasWxA gg as FigureCanvas
        from matplotlib import rcParams, mlab, cm
        from matplotlib.mlab import meshgrid
        from matplotlib.figu re import Figure
        from matplotlib.axes import Subplot


        hope this might help you somewhat,
        cheers,
        Stef

        Comment

        • Stef Mientki

          #5
          Re: pyinstall and matplotlib

          >>Traceback (most recent call last):
          >> File "multicolor.py" , line 11, in ?
          >> File "pylab.pyc" , line 1, in ?
          >> File "matplotlib\pyl ab.pyc", line 222, in ?
          >> File "matplotlib\bac kends\__init__. pyc", line 24, in pylab_setup
          >> File "matplotlib\bac kends\backend_t kagg.pyc", line 7, in ?
          >>ImportError : No module named Tkinter
          >>Any ideas?
          >>Thanks,
          >BTW: I don't use Tkinter for GUI, I use PythonCard and wxPython. May
          >be the Tkinter is invoked by the multicolor.py sample?
          >
          I tried another application which I know for sure doesn't use Tkinter
          and yet it still tries to invoke Tkinter. So, I need to disable the
          backend_tkagg.p yc somehow.
          >
          Any suggestions?
          >
          Thanks,
          hi John,

          I've started a discussion on the MatPlotLib list,
          (and others, but now limited to matplotlib-list)
          you might want to follow the discussion over there.
          I just read that the real solution seems to be in setup.cfg,
          and AFAIK that file is missing in the distro.

          cheers,
          Stef

          Comment

          Working...