Python Pmw and cx_Freeze?

I cannot make an executable from my python program that uses Pmw (Python mega widgets). I am using cx_Freeze (via gui backend "Gui2Exe"). Searching the Pmw site I found that this was caused by the Pmw library checking for modules at startup and not working when you use py2exe or similar programs because the libraries are in the zip file. More information can be found here: http://pmw.sourceforge.net/doc/dynamicloader.html Therefore they give a solution on this page in the "Freezing Pmw" section, providing a script that generates one standalone Pmw module, which you can easily to freeze. However, the script uses outdated code and will not work with Python 2.6+. I tried to change it with no luck.

EDIT: I would like to mention that replacing "regex" with "re" will not work.

#!/usr/bin/env python # Helper script when freezing Pmw applications. It concatenates all # Pmw megawidget files into a single file, 'Pmw.py', in the current # directory. The script must be called with one argument, being the # path to the 'lib' directory of the required version of Pmw. # To freeze a Pmw application, you will also need to copy the # following files to the application directory before freezing: # # PmwBlt.py PmwColor.py import os import regsub import string import sys # The order of these files is significant. Files which reference # other files must appear later. Files may be deleted if they are not # used. files = [ 'Dialog', 'TimeFuncs', 'Balloon', 'ButtonBox', 'EntryField', 'Group', 'LabeledWidget', 'MainMenuBar', 'MenuBar', 'MessageBar', 'MessageDialog', 'NoteBook', 'OptionMenu', 'PanedWidget', 'PromptDialog', 'RadioSelect', 'ScrolledCanvas', 'ScrolledField', 'ScrolledFrame', 'ScrolledListBox', 'ScrolledText', 'HistoryText', 'SelectionDialog', 'TextDialog', 'TimeCounter', 'AboutDialog', 'ComboBox', 'ComboBoxDialog', 'Counter', 'CounterDialog', ] # Set this to 0 if you do not use any of the Pmw.Color functions: needColor = 1 # Set this to 0 if you do not use any of the Pmw.Blt functions: needBlt = 1 def expandLinks(path): if not os.path.isabs(path): path = os.path.join(os.getcwd(), path) while 1: if not os.path.islink(path): break dir = os.path.dirname(path) path = os.path.join(dir, os.readlink(path)) return path def mungeFile(file): # Read the file and modify it so that it can be bundled with the # other Pmw files. file = 'Pmw' + file + '.py' text = open(os.path.join(srcdir, file)).read() text = regsub.gsub('import Pmw\>', '', text) text = regsub.gsub('INITOPT = Pmw.INITOPT', '', text) text = regsub.gsub('\<Pmw\.', '', text) text = '\n' + ('#' * 70) + '\n' + '### File: ' + file + '\n' + text return text # Work out which version is being bundled. file = sys.argv[0] file = os.path.normpath(file) file = expandLinks(file) dir = os.path.dirname(file) dir = expandLinks(dir) dir = os.path.dirname(dir) dir = expandLinks(dir) dir = os.path.basename(dir) version = string.replace(dir[4:], '_', '.') # Code to import the Color module. colorCode = """ import PmwColor Color = PmwColor del PmwColor """ # Code to import the Blt module. bltCode = """ import PmwBlt Blt = PmwBlt del PmwBlt """ # Code used when not linking with PmwBlt.py. ignoreBltCode = """ _bltImported = 1 _bltbusyOK = 0 """ # Code to define the functions normally supplied by the dynamic loader. extraCode = """ ### Loader functions: _VERSION = '%s' def setversion(version): if version != _VERSION: raise ValueError, 'Dynamic versioning not available' def setalphaversions(*alpha_versions): if alpha_versions != (): raise ValueError, 'Dynamic versioning not available' def version(alpha = 0): if alpha: return () else: return _VERSION def installedversions(alpha = 0): if alpha: return () else: return (_VERSION,) """ if '-noblt' in sys.argv: sys.argv.remove('-noblt') needBlt = 0 if '-nocolor' in sys.argv: sys.argv.remove('-nocolor') needColor = 0 if len(sys.argv) != 2: print 'usage: bundlepmw.py [-noblt] [-nocolor] /path/to/Pmw/Pmw_X_X_X/lib' sys.exit() srcdir = sys.argv[1] if os.path.exists('Pmw.py'): print 'Pmw.py already exists. Remove it and try again.' sys.exit() outfile = open('Pmw.py', 'w') if needColor: outfile.write(colorCode) if needBlt: outfile.write(bltCode) outfile.write(extraCode % version) # Specially handle PmwBase.py file: text = mungeFile('Base') text = regsub.gsub('import PmwLogicalFont', '', text) text = regsub.gsub('PmwLogicalFont._font_initialise', '_font_initialise', text) outfile.write(text) if not needBlt: outfile.write(ignoreBltCode) files.append('LogicalFont') for file in files: text = mungeFile(file) outfile.write(text) print '' print ' Pmw.py has been created.' if needColor or needBlt: print ' Before running freeze, also copy the following file(s):' if needBlt: print ' ' + os.path.join(srcdir, 'PmwBlt.py') if needColor: print ' ' + os.path.join(srcdir, 'PmwColor.py') 
+2
source share
1 answer

Unfortunately, the source file has some problems with tabs and spaces (just look at the while indent in expandlinks ).

I fixed these indented issues, changed regsub.gsub to re.sub and excluded string import using string type methods.

After that, the script worked fine:

  Pmw.py has been created. Before running freeze, also copy the following file(s): C:\Users\joaquin\Desktop\Pmw.1.3.2\src\Pmw\Pmw_1_3\lib\PmwBlt.py C:\Users\joaquin\Desktop\Pmw.1.3.2\src\Pmw\Pmw_1_3\lib\PmwColor.py 

Here you have adjusted the script:

 #!/usr/bin/env python # Helper script when freezing Pmw applications. It concatenates all # Pmw megawidget files into a single file, 'Pmw.py', in the current # directory. The script must be called with one argument, being the # path to the 'lib' directory of the required version of Pmw. # To freeze a Pmw application, you will also need to copy the # following files to the application directory before freezing: # # PmwBlt.py PmwColor.py import os import re import sys # The order of these files is significant. Files which reference # other files must appear later. Files may be deleted if they are not # used. files = [ 'Dialog', 'TimeFuncs', 'Balloon', 'ButtonBox', 'EntryField', 'Group', 'LabeledWidget', 'MainMenuBar', 'MenuBar', 'MessageBar', 'MessageDialog', 'NoteBook', 'OptionMenu', 'PanedWidget', 'PromptDialog', 'RadioSelect', 'ScrolledCanvas', 'ScrolledField', 'ScrolledFrame', 'ScrolledListBox', 'ScrolledText', 'HistoryText', 'SelectionDialog', 'TextDialog', 'TimeCounter', 'AboutDialog', 'ComboBox', 'ComboBoxDialog', 'Counter', 'CounterDialog', ] # Set this to 0 if you do not use any of the Pmw.Color functions: needColor = 1 # Set this to 0 if you do not use any of the Pmw.Blt functions: needBlt = 1 def expandLinks(path): if not os.path.isabs(path): path = os.path.join(os.getcwd(), path) while 1: if not os.path.islink(path): break dir = os.path.dirname(path) path = os.path.join(dir, os.readlink(path)) return path def mungeFile(file): # Read the file and modify it so that it can be bundled with the # other Pmw files. file = 'Pmw' + file + '.py' text = open(os.path.join(srcdir, file)).read() text = re.sub('import Pmw\>', '', text) text = re.sub('INITOPT = Pmw.INITOPT', '', text) text = re.sub('\<Pmw\.', '', text) text = '\n' + ('#' * 70) + '\n' + '### File: ' + file + '\n' + text return text # Work out which version is being bundled. file = sys.argv[0] file = os.path.normpath(file) file = expandLinks(file) dir = os.path.dirname(file) dir = expandLinks(dir) dir = os.path.dirname(dir) dir = expandLinks(dir) dir = os.path.basename(dir) version = dir[4:].replace('_', '.') # Code to import the Color module. colorCode = """ import PmwColor Color = PmwColor del PmwColor """ # Code to import the Blt module. bltCode = """ import PmwBlt Blt = PmwBlt del PmwBlt """ # Code used when not linking with PmwBlt.py. ignoreBltCode = """ _bltImported = 1 _bltbusyOK = 0 """ # Code to define the functions normally supplied by the dynamic loader. extraCode = """ ### Loader functions: _VERSION = '%s' def setversion(version): if version != _VERSION: raise ValueError, 'Dynamic versioning not available' def setalphaversions(*alpha_versions): if alpha_versions != (): raise ValueError, 'Dynamic versioning not available' def version(alpha = 0): if alpha: return () else: return _VERSION def installedversions(alpha = 0): if alpha: return () else: return (_VERSION,) """ if '-noblt' in sys.argv: sys.argv.remove('-noblt') needBlt = 0 if '-nocolor' in sys.argv: sys.argv.remove('-nocolor') needColor = 0 if len(sys.argv) != 2: print 'usage: bundlepmw.py [-noblt] [-nocolor] /path/to/Pmw/Pmw_X_X_X/lib' sys.exit() srcdir = sys.argv[1] if os.path.exists('Pmw.py'): print 'Pmw.py already exists. Remove it and try again.' sys.exit() outfile = open('Pmw.py', 'w') if needColor: outfile.write(colorCode) if needBlt: outfile.write(bltCode) outfile.write(extraCode % version) # Specially handle PmwBase.py file: text = mungeFile('Base') text = re.sub('import PmwLogicalFont', '', text) text = re.sub('PmwLogicalFont._font_initialise', '_font_initialise', text) outfile.write(text) if not needBlt: outfile.write(ignoreBltCode) files.append('LogicalFont') for file in files: text = mungeFile(file) outfile.write(text) print '' print ' Pmw.py has been created.' if needColor or needBlt: print ' Before running freeze, also copy the following file(s):' if needBlt: print ' ' + os.path.join(srcdir, 'PmwBlt.py') if needColor: print ' ' + os.path.join(srcdir, 'PmwColor.py') 
+2
source

Source: https://habr.com/ru/post/1216545/


All Articles