#85: Supporing Python 3
-------------------------+--------------------------------------------------
 Reporter:  Lakshman     |       Owner:  giovannibajo
     Type:  enhancement  |      Status:  new         
 Priority:  normal       |   Milestone:              
Component:  PyInstaller  |     Version:              
 Severity:  normal       |    Keywords:              
-------------------------+--------------------------------------------------
 Below are the changes I made in the .py files before applying 2to3 tool to
 convert the PyInstaller code to support Python 3
 File Name: PyInstaller/archive.py:
 219:    #self.lib.write('\0'*self.HDRLEN)# - - -
 self.lib.write(b'\0'*self.HDRLEN)# + + +

 292:    #MAGIC = 'PYZ\0'# - - -
 MAGIC = b'PYZ\0'# + + +

 File Name: PyInstaller/bindepend.py:
 114:    #npth = os.path.join(p, string.lower(mod))# - - -
          npth = os.path.join(p, mod.lower())# + + +

 132:    #tokens = string.split(txt[i])# - - -
          #if len(tokens) == 1 and string.find(tokens[0], '.') > 0:# - - -
                 #rslt.append(string.strip(tokens[0]))# - - -

         tokens = txt[i].split()# + + +
                 if len(tokens) == 1 and tokens[0].find('.') > 0:# + + +
                         rslt.append(tokens[0].strip())# + + +

 265:    #nm, jnk = string.split(nm, '\0', 1)# - - -
                 nm, sep, jnk = nm.partition(b'\0')# + + +
                 nm = str(nm) # + + +
                 jnk, sep, nm = nm.partition('\'') # + + +
                 nm = nm.rstrip('\'') # + + +

 278:    #fullnm = string.upper(os.path.basename(pth))# - - -
                 #if seen.get(string.upper(nm),0):
                 fullnm = os.path.basename(pth).upper()# + + +
                 if seen.get(nm.upper(),0): # + + +

 282:    #seen[string.upper(nm)] = 1# - - -
                 seen[nm.upper()] = 1# + + +

 284:    #if seen.get(string.upper(lib),0):# - - -
         if seen.get(lib.upper(),0):# + + +

 401:    #_bpath.extend(string.split(os.environ.get('PATH', ''),
 os.pathsep))# - - -
          _bpath.extend(os.environ.get('PATH', '').split(os.pathsep))# + +
 +

 418:    #for path in string.split(lp, os.pathsep):# - - -
          for path in lp.split(os.pathsep):# + + +

 File Name: PyInstaller/Build.py
 33:     #import UserList# - - -
 import collections# + + +

 856:    #class TOC(UserList.UserList):# - - -
 class TOC(collections.UserList):# + + +

 858:    #UserList.UserList.__init__(self)# - - -
                 collections.UserList.__init__(self)# + + +

 File Name: PyInstaller/carchive.py:
 91:     #return string.join(rslt, '')# - - -
                 return b''.join(rslt)# + + +

 124:    #MAGIC = 'MEI\014\013\012\013\016'# - - -
         MAGIC = b'MEI\014\013\012\013\016'# + + +

 File Name: PyInstaller/Configure.py
 97:     #a.analyze_r('Tkinter')# - - -
         a.analyze_r('tkinter')# + + +

 File Name: PyInstaller/icon.py:
 28:     #StringTypes = types.StringTypes# - - -
         StringTypes = str# + + +

 File Name: PyInstaller/iu.py:
 48:     #STRINGTYPE = basestring# - - -
         STRINGTYPE = str# - - -
 403:    if importernm.find('xml.sax') == -1:# + + +
 importernm = _string_split(importernm, '.')[:-level]
 importernm = _string_join('.', importernm)

 File Name: PyInstaller/Makespec.py:
 27:     #True  = 1 == 1 # - - -
         #False = not True # - - -
         pass # + + +
 File Name: PyInstaller/mf.py:
 21:     #import sys, string, os, imp, marshal, dircache, glob# - - -
 import sys, string, os, imp, marshal, glob# + + +
 38:     #STRINGTYPE = basestring# - - -
 STRINGTYPE = str# + + +
 44:     #files = dircache.listdir(os.path.dirname(filename))# - - -
                 files = os.listdir(os.path.dirname(filename))# + + +
 116:    #stuff = self._read(py[0])+'\n'# - - -
 #co = compile(string.replace(stuff, "\r\n", "\n"), py[0], 'exec')# - - -
 stuff = (self._read(py[0])).decode()+'\n' # + + +
 co = compile(stuff.replace("\r\n", "\n"), py[0], 'exec')# + + +

 394:    #import UserDict# - - -
         #class LogDict(UserDict.UserDict):# - - -
         import collections# + + +
         class LogDict(collections.UserDict):# + + +
 398:    #UserDict.UserDict.__init__(self, *args)# - - -
 collections.UserDict.__init__(self, *args)# + + +

 404:    #UserDict.UserDict.__setitem__(self, key, value)# - - -
             collections.UserDict.__setitem__(self, key, value)# + + +

 407:    #UserDict.UserDict.__delitem__(self, key)# - - -
             collections.UserDict.__delitem__(self, key)# + + +
 441:    #nms = map(None, nms, [importer]*len(nms))#  - - -
                 names = list(nms)#  + + +
                 nms = []# + + +
                 for name1 in names: # + + +
 nms.append((name1,importer))#  + + +
 460:    #newnms = map(None, newnms, [nm]*len(newnms))#  - - -
 names = list(newnms)#  + + +
 newnms = []
 for name2 in names:
 newnms.append((name2,nm))#  + + +
 473:    #nmparts = string.split(nm, '.')# - - -
                 nmparts = nm.split('.')# + + +

 483:    #pkgnm = string.join(string.split(importernm, '.')[:-1], '.')# - -
 -
                 pkgnm = '.'.join(importernm.split('.')[:-1])# + + +

 492:    #contexts = [string.join(string.split(importernm, '.')[:-level],
 '.')]# - - -
 if importernm.find('xml.sax') == -1:# + + + for handling import xml.sax
 contexts = ['.'.join(importernm.split('.')[:-level])]
 else:# + + +
 contexts = ['.'.join(importernm.split('.'))]# + + +
 553:    #co = compile(string.replace(stuff, "\r\n", "\n"), fnm, 'exec')# -
 - -
             co = compile(stuff.replace("\r\n", "\n"), fnm, 'exec')# + + +

 858:    #EXEC_STMT = dis.opname.index('EXEC_STMT')# - - -

 893:    #op = ord(c)# - - -
                 op = c# + + +
 895:    #oparg = ord(code[i]) + ord(code[i+1])*256# - - -
             oparg = code[i] + code[i+1]*256# + + +
 972:    #elif op == EXEC_STMT: # - - -
                 #    cndtl = ['', 'conditional'][conditional] # - - -
         #    lvl = ['top-level', 'delayed'][nested] # - - -
                 #    w.append("W: %s %s exec statement detected at line
 %s"  % (lvl, cndtl, curline)) # - - -

 File Name: PyInstaller/hooks/hook-iu.py:
 33:     #pos = string.find(nm, '.')# - - -
                 pos = nm.find('.')# + + +
 File Name: PyInstaller/hooks/hook-os.py
 38:     #pos = string.find(nm, '.')# - - -
 pos = nm.find('.')# + + +

 File Name: PyInstaller/hooks/hook-xml.py
 27:     #txt = exec_statement("import xml;print xml.__file__")# - - -
         txt = exec_statement("import xml;print (xml.__file__)")# + + +
 29:     #if string.find(txt, '_xmlplus') > -1:# - - -
         if txt.find('_xmlplus') > -1:# + + +
 File Name: PyInstaller/pyi_optik/option.py
 22:     #(True, False) = (1, 0)# - - -
         pass# + + +
 83:     #choices = string.join(map(repr, option.choices), ", ")# - - -
                 choices = ", ".join(list(map(repr, option.choices)))# + +
 +
 327:    #self.dest = string.replace(self._long_opts[0][2:], '-', '_')# - -
 -
 self.dest = self._long_opts[0][2:].replace('-', '_')# + + +

 File Name: PyInstaller/pyi_optik/option_parser.py:
 30:     #(True, False) = (1, 0)# - - - SyntaxError: assignment to keyword
          pass # + + +
 725:    #return string.replace(s, "%prog", self.get_prog_name())# - - -
                 return s.replace("%prog", self.get_prog_name())# + + +

 File Name: PyInstaller/pyi_optik/textwrap.py:
 19:     #(True, False) = (1, 0)# - - - SyntaxError: assignment to keyword
         pass # + + +
 75:     # whitespace_trans = string.maketrans(_whitespace, ' ' *
 len(_whitespace))# - - -
         whitespace_trans = string.maketrans(_whitespace.encode(), (' ' *
 len(_whitespace)).encode())# + + +
 103:    sentence_end_re = re.compile(r'[%s]'              # lowercase
 letter
                                  r'[\.\!\?]'          # sentence-ending
 punct.
                                  r'[\"\']?'           # optional end-of-
 quote
                                  % string.ascii_letters)# + + +
                                  #% string.lowercase)# - - -
 AttributeError: 'module' object has no
 File Name: PyInstaller/source/linux/make.py:
 45:     #True, False = 1, 0# - - -
         pass# + + +

 130:    freeze_exceptions = 0# + + +
         files = ['main.c', '../common/launch.c'] # + + +
         have_warnings = 1# + + +
         #Commented the lines below because there is no module called
 exceptions in python 3
         """have_warnings = 0
         import exceptions
         if not hasattr(exceptions, '__file__'):
                 freeze_exceptions = 0
                 files = ['main.c', '../common/launch.c']
                 if hasattr(exceptions, 'Warning'):
                 have_warnings = 1
         else:
                 freeze_exceptions = 1
                 import exceptions
                 print "reading exceptions from", exceptions.__file__
                 inf = open(exceptions.__file__, 'rb')
                 inf.seek(8)
                 code = inf.read()
                 codelen = len(code)
                 outfp = bkfile.open('M_exceptions.c', 'w')
                 files = ['M_exceptions.c', 'main.c', '../common/launch.c']
                 outfp.write('unsigned char M_exceptions[] = {')
                 for i in range(0, len(code), 16):
                 outfp.write('\n\t')
                 for c in code[i:i+16]:
                 outfp.write('%d,' % ord(c))
                 outfp.write('\n};\n')
                 outfp.close()
 """

 178:    #somevars['CFLAGS'] = string.join(cflags) # override# - - -
         somevars['CFLAGS'] = ' '.join(cflags) # override# + + +
 189:    #makemakefile.writevars(outfp, somevars, string.join(targets))# -
 - -
                 makemakefile.writevars(outfp, somevars, '
 '.join(targets))# + + +

 197:    #print 'Now run "make" to build the targets:',
 string.join(targets)# - - -
         print('Now run "make" to build the targets:', ' '.join(targets))#
 + + +

 File Name: PyInstaller/source/linux/makemakefile:
 44:     #outfp.write("\n%s: %s\n" % (target, string.join(deps)))# - - -
         #outfp.write("\t$(CC) %s -o %s $(LDLAST)\n" %(string.join(files),
 target))
         outfp.write("\n%s: %s\n" % (target, ' '.join(deps)))# + + +
         outfp.write("\t$(CC) %s -o %s $(LDLAST)\n" %(' '.join(files),
 target))

 After applying the 2to3 conversion tool I needed to change two lines in
 the file PyInstaller/py_optic/option_parser.py. Thes changes are as below:
 210, 496:       if type(args[0]) is types.StringType: #before applying
 2to3 tool
                 if type(args[0]) is bytes: #after applying 2to3 tool
                 if type(args[0]) is str: # I needed to change to

 Below are the changes I made in the bootloader program to support to make
 it work with Python 3. After making these changes I used Scon and Python
 2.6 to build the bootloader.
 File Name: PyInstaller/source/common/launch.c
 69:     //DECLPROC(PyString_FromStringAndSize);// - - -
 //DECLPROC(PyFile_FromString); // - - -
 //DECLPROC(PyString_AsString); // - - -
 DECLPROC(PyBytes_FromStringAndSize);// + + +
 DECLPROC(PyBytes_AsString);// + + +

 87:     //DECLPROC(PyInt_AsLong);// - - -
 DECLPROC(PyLong_AsLong);// + + +

 394:    //GETPROC(dll, PyString_FromStringAndSize);// - - -
         GETPROC(dll, PyBytes_FromStringAndSize);// + + +
 403:    //GETPROC(dll, PyFile_FromString);// - - -
         //GETPROC(dll, PyString_AsString); // - - -
         GETPROC(dll, PyBytes_AsString); // + + +
 422:    //GETPROC(dll, PyInt_AsLong);// - - -
         GETPROC(dll, PyLong_AsLong);// + + +
 730:    //co = PI_PyObject_CallFunction(loadfunc, "s#", modbuf+8,
 ntohl(ptoc->ulen)-8);// - - -
 co = PI_PyObject_CallFunction(loadfunc, "y#", modbuf+8,
 ntohl(ptoc->ulen)-8);// + + +
 871:    //block_size = PI_PyInt_AsLong(PI_PyDict_GetItemString(aes_dict,
 "block_size"));// - - -
         block_size = PI_PyLong_AsLong(PI_PyDict_GetItemString(aes_dict,
 "block_size"));// + + +
 881:    //memcpy(data, PI_PyString_AsString(ddata),
 ntohl(ptoc->len)-32);// - - -
         memcpy(data, PI_PyBytes_AsString(ddata), ntohl(ptoc->len)-32);// +
 + +
 1038:   //__file__ = PI_PyString_FromStringAndSize(buf, strlen(buf));// -
 - -
         __file__ = PI_PyBytes_FromStringAndSize(buf, strlen(buf));// + + +
 1089:   //*presult = PI_PyInt_AsLong(pyresult);// - - -
         *presult = PI_PyLong_AsLong(pyresult);// + + +

 File Name: PyInstaller/source/common/launch.h
 120:    //EXTDECLPROC(PyObject *, PyString_FromStringAndSize, (const char
 *, int));// - - -
 //EXTDECLPROC(PyObject *, PyFile_FromString, (char *, char *));// - - -
 //EXTDECLPROC(char *, PyString_AsString, (PyObject *));// - - -
 EXTDECLPROC(PyObject *, PyBytes_FromStringAndSize, (const char *, int));//
 + + +
 EXTDECLPROC(char *, PyBytes_AsString, (PyObject *));// + + +
 138:    //EXTDECLPROC(long, PyInt_AsLong, (PyObject *) );// - - -
 EXTDECLPROC(long, PyLong_AsLong, (PyObject *) );// + + +

 File Name: PyInstaller/sconstruct
 20:     import os
 33:     #base_env = Environment(MSVS_VERSION = msvs_ver)# - - -
         base_env = Environment(ENV = {'PATH' : os.environ['PATH']}) # + +
 +

 For making all of these changes I took help from Python 3 manual, the site
 http://diveintopython3.org/table-of-contents.html and other information
 from net.

 This is working fine with Linux, but on Windows I am getting “The
 exception unknown software exception (0xc0000417) occurred in the
 application at location 0x78588389”.

 Please guide me to resolve this issue.

-- 
Ticket URL: <http://www.pyinstaller.org/ticket/85>
Pyinstaller <http://www.pyinstaller.org>
PyInstaller Project

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"PyInstaller" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/PyInstaller?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to