Py2exe and numpy do not have time

I am trying to use py2exe-0.6.9.win32 to complete an application that I wrote in Python2.6.5 using the following object libraries with the corresponding download file names:

Matplotlib-0.99.3.win32

numpy-1.4.1-win32

SciPy-0.8.0b1-win32

wxPython2.8-win32-unicode-2.8.11.0

I get error messages when I try to run the resulting .exe file. At the moment, the error message is related to numpy, although before that I was getting something related to matplot lib data files that are not loading and thus block the launch of my exe file.

Instead of posting a million code and all error messages, I am posting a more general question: Can someone show me some instructions so that all of these object libraries and versions play well together using py2exe to create an exe work file?

I have read things that come up with Google search queries on this topic, but it looks like it's a wild goose stalker in which everyone uses different versions of different things. I can change some versions of some of these object libraries if that matters, but I already wrote 5,000 lines of code in this signal processing application, and I would prefer not to rewrite all of this if possible.


EDIT:

Here is a simplified version of my code in the GUIdiagnostics.py file that I did to test the ability of my py2exe script to import all the libraries I need in my real application:

import time import wxversion import wx import csv import os import pylab as p from scipy import stats import math from matplotlib import * from numpy import * from pylab import * import scipy.signal as signal import scipy.optimize import Tkinter ID_EXIT = 130 class MainWindow(wx.Frame): def __init__(self, parent,id,title): wx.Frame.__init__(self,parent,wx.ID_ANY,title, size = (500,500), style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE) # A button self.button =wx.Button(self, label="Click Here", pos=(160, 120)) self.Bind(wx.EVT_BUTTON,self.OnClick,self.button) # the combobox Control self.sampleList = ['first','second','third'] self.lblhear = wx.StaticText(self, label="Choose TestID to filter:", pos=(20, 75)) self.edithear = wx.ComboBox(self, pos=(160, 75), size=(95, -1), choices=self.sampleList, style=wx.CB_DROPDOWN) # the progress bar self.progressMax = 3 self.count = 0 self.newStep='step '+str(self.count) self.dialog = None #-------Setting up the menu. # create a new instance of the wx.Menu() object filemenu = wx.Menu() # enables user to exit the program gracefully filemenu.Append(ID_EXIT, "E&xit", "Terminate the program") #------- Creating the menu. # create a new instance of the wx.MenuBar() object menubar = wx.MenuBar() # add our filemenu as the first thing on this menu bar menubar.Append(filemenu,"&File") # set the menubar we just created as the MenuBar for this frame self.SetMenuBar(menubar) #----- Setting menu event handler wx.EVT_MENU(self,ID_EXIT,self.OnExit) self.Show(True) def OnExit(self,event): self.Close(True) def OnClick(self,event): try: if not self.dialog: self.dialog = wx.ProgressDialog("Progress in processing your data.", self.newStep, self.progressMax, style=wx.PD_CAN_ABORT | wx.PD_APP_MODAL | wx.PD_SMOOTH) self.count += 1 self.newStep='Start' (keepGoing, skip) = self.dialog.Update(self.count,self.newStep) TestID = self.edithear.GetValue() self.count += 1 self.newStep='Continue.' (keepGoing, skip) = self.dialog.Update(self.count,self.newStep) myObject=myClass(TestID) print myObject.description self.count += 1 self.newStep='Finished.' (keepGoing, skip) = self.dialog.Update(self.count,self.newStep) self.count = 0 self.dialog.Destroy() except: self.dialog.Destroy() import sys, traceback xc = traceback.format_exception(*sys.exc_info()) d = wx.MessageDialog( self, ''.join(xc),"Error",wx.OK) d.ShowModal() # Show it d.Destroy() #finally destroy it when finished class myClass(): def __init__(self,TestID): self.description = 'The variable name is: '+str(TestID)+'. ' app = wx.PySimpleApp() frame = MainWindow(None,-1,"My GUI") app.MainLoop() 

Here is the code for setup.py, which is the file containing my py2exe code:

 from distutils.core import setup import py2exe # Remove the build folder, a bit slower but ensures that build contains the latest import shutil shutil.rmtree("build", ignore_errors=True) # my setup.py is based on one generated with gui2exe, so data_files is done a bit differently data_files = [] includes = [] excludes = ['_gtkagg', '_tkagg', 'bsddb', 'curses', 'pywin.debugger', 'pywin.debugger.dbgcon', 'pywin.dialogs', 'tcl', 'Tkconstants', 'Tkinter', 'pydoc', 'doctest', 'test', 'sqlite3' ] packages = ['pytz'] dll_excludes = ['libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll', 'tcl84.dll', 'tk84.dll'] icon_resources = [] bitmap_resources = [] other_resources = [] # add the mpl mpl-data folder and rc file import matplotlib as mpl data_files += mpl.get_py2exe_datafiles() setup( windows=['GUIdiagnostics.py'], # compressed and optimize reduce the size options = {"py2exe": {"compressed": 2, "optimize": 2, "includes": includes, "excludes": excludes, "packages": packages, "dll_excludes": dll_excludes, # using 2 to reduce number of files in dist folder # using 1 is not recommended as it often does not work "bundle_files": 2, "dist_dir": 'dist', "xref": False, "skip_archive": False, "ascii": False, "custom_boot_script": '', } }, # using zipfile to reduce number of files in dist zipfile = r'lib\library.zip', data_files=data_files ) 

I ran this code by entering the following line into the windows command line interface (cmd.exe) according to the following link:

 setup.py py2exe 

Then Py2exe starts, but when I try to run the resulting exe file, it creates a log file containing the following message:

 Traceback (most recent call last): File "setup.py", line 6, in <module> File "zipextimporter.pyo", line 82, in load_module File "pylab.pyo", line 1, in <module> File "zipextimporter.pyo", line 82, in load_module File "matplotlib\pylab.pyo", line 206, in <module> File "zipextimporter.pyo", line 82, in load_module File "matplotlib\mpl.pyo", line 3, in <module> File "zipextimporter.pyo", line 82, in load_module File "matplotlib\axes.pyo", line 14, in <module> File "zipextimporter.pyo", line 82, in load_module File "matplotlib\collections.pyo", line 21, in <module> File "zipextimporter.pyo", line 82, in load_module File "matplotlib\backend_bases.pyo", line 32, in <module> File "zipextimporter.pyo", line 82, in load_module File "matplotlib\widgets.pyo", line 12, in <module> File "zipextimporter.pyo", line 82, in load_module File "matplotlib\mlab.pyo", line 388, in <module> TypeError: unsupported operand type(s) for %: 'NoneType' and 'dict' 

Can someone show me how to edit setup.py so py2exe can create numpy, scipy, matplotlib executable, etc.?


SECOND EDIT:

OK Today I tried the RC advice again, that I have a fresh mind for this, and I got the same error, but I include it below. Here is the code for the cxsetup.py file that I created after the template: http://cx-freeze.sourceforge.net/cx_Freeze.html .

 from cx_Freeze import setup, Executable setup( name = "Potark", version = "0.1", description = "My application.", executables = [Executable("Potark-ICG.py")]) 

Unfortunately, running it on the command line (cmd.exe) using the command:

 python cxsetup.py build 

generates the following error on the command line:

 ImportError: No module named cx_Freeze 

The directory on the command line is the directory for my application, which is located in a subfolder of the desktop. This is different from the directory for a python application, but I assume cmd.exe can figure it out, because python can figure it out. I am wrong? As a test, I added the following line of code to the first line of cxsetup.py:

 import matplotlib 

But this led to an almost identical error:

 ImportError: No module named matplotlib 

I tried to keep this thread whole and short, but it gets long. Can anyone help me with this? I would really like all the work of switching to cx_freeze to be found only to find that it cannot work with numpy, matplotlib, scipy, etc.

+7
source share
3 answers

Looks like the problem mentioned below: http://www.py2exe.org/index.cgi/MatPlotLib

It looks like you need to make a few small changes to mlab.py:

 psd.__doc__ = psd.__doc__ % kwdocd 

to

 if psd.__doc__ is not None: psd.__doc__ = psd.__doc__ % kwdocd else: psd.__doc__ = "" 

If you have not seen this page, here's how I got there: http://www.py2exe.org/index.cgi/WorkingWithVariousPackagesAndModules

+2
source

As others noted, py2exe seems to require ugly, random fixes on a case-by-case basis ... there seems to be no way around this. In addition, some errors refuse to go away and do not affect the program, but cause the program to inform the user that an error log has been created after the exit. To avoid this, I use this code:

 import sys IS_USING_PY2EXE = hasattr(sys, "frozen") # Redirect output to a file if this program is compiled. if IS_USING_PY2EXE: # Redirect log to a file. LOG_FILENAME = os.path.join(logDir, "myfile.log") print('Redirecting Stderr... to %s' % LOG_FILENAME) logFile = open(os.path.join(LOG_FILENAME),"w") # a --> append, "w" --> write sys.stderr = logFile sys.stdout = logFile 
0
source

It might just be silly, but why aren't you trying to upgrade your scipy from 0.8.0b1 to 0.8.0 and do the same with matplotlib? Numpy 1.4.1 will still be fine.

0
source

All Articles