Home > py2exe > Py2exe: errori post freeze

Py2exe: errori post freeze

1 Luglio 2011

Stavo “congelando” i sorgenti di una applicazione di prova,
con py2exe.
Ho usato questo sample:

#!/usr/bin/python
"""py2exe custom setup Sample
author: bancaldo"""

import py2exe, sys, wx, os
from distutils.core import setup

if len(sys.argv) == 1:
    sys.argv.append("py2exe")
    sys.argv.append("-q")

class FileBrowser(wx.FileDialog):
    '''Class for file browser'''
    def __init__(self):
        self.fin = None
        wildcard = "File di testo (*.py)|*.py|" 
            "Tutti i files (*.*)|*.*"
        wx.FileDialog.__init__(self, None, "scegli il file", os.getcwd(),
                               "", wildcard, wx.OPEN | wx.CHANGE_DIR)

        if self.ShowModal() == wx.ID_OK:  
            print(self.GetPath())
            self.file = self.GetPath()
            self.fin = open(self.file, 'r')
        else:
            print "operazione apertura annullata"
            self.Destroy()
        self.Destroy()

class Target(object):
    '''Terget'''
    def __init__(self, **kw):
        self.__dict__.update(kw)
        # info di versione
        self.version = "1.0.0"
        self.company_name = "Bancaldo TM"
        self.copyright = "no copyright"
        self.name = "py2exe sample files"

def main():
    '''py2exe setup starter'''
    app = wx.PySimpleApp()
    app.MainLoop()
    manifest_template = '''
    <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
    <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
          <requestedPrivileges>
            <requestedExecutionLevel level='asInvoker' uiAccess='false' />
          </requestedPrivileges>
        </security>
      </trustInfo>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity 
    	 type='win32' 
    	 name='Microsoft.VC90.CRT' 
    	 version='9.0.21022.8' 
    	 processorArchitecture='*' 
   	 publicKeyToken='1fc8b3b9a1e18e3b' />
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity
             type="win32"
             name="Microsoft.Windows.Common-Controls"
             version="6.0.0.0"
             processorArchitecture="*"
             publicKeyToken="6595b64144ccf1df"
             language="*" />
        </dependentAssembly>
      </dependency>
    </assembly>
    '''
    file_to_freeze = FileBrowser().file
    textentry = wx.TextEntryDialog(None, "nome file EXE?", '', '')
    if textentry.ShowModal() == wx.ID_OK:
        destname = textentry.GetValue()

    rt_manifest = 24
    explicit_incl = []
    other_res = [(rt_manifest, 1, manifest_template % dict(prog = "Prova"))]
    setup_opts = {"py2exe": {"includes": explicit_incl,
                             "compressed": 1,
                             "optimize": 2,
                             #"ascii": 1,
                             "bundle_files": 1,}}
    test_wx = Target(description = "A GUI app",
                     script = file_to_freeze,
                     other_resources = other_res,
                     icon_resources = [(1, "py.ico")],
                     dest_base = destname)

    setup(data_files = ["py.ico"],
          options = setup_opts,
          zipfile = None,
          windows = [test_wx],
        )

if __name__ == '__main__':
    main()

La creazione dell’eseguibile è avvenuta correttamente, ma una volta eseguito il file.exe risultante, un messaggio mi avvisa di controllare il log a causa di un errore:
Mi sono trovato davanti a questa serie di messaggi

  File "sqlalchemyengine__init__.pyo", line 263, in create_engine
  File "sqlalchemyenginestrategies.pyo", line 50, in create
  File "sqlalchemyengineurl.pyo", line 116, in get_dialect
sqlalchemy.exc.ArgumentError: Could not determine dialect for 'sqlite'.

per risolvere il problema, ci sono 2 strade:
o si inserisce un import esplicito nel file Data.py (orrido),
cioè dove si fa riferimento ad sqlalchemy

from sqlalchemy.dialects.sqlite.base import dialect

o si aggiunge il percorso del modulo contenente i dialect
negli includes del file di setup di py2exe:

explicit_incl = ["sqlalchemy.dialects.sqlite.base"]

Rilanciato py2exe, ho rieseguito il file.exe e di nuovo mi viene segnalato un errore.
Controllo di cosa si tratta e trovo questo nel log:

  ...
  File "sqlalchemyprocessors.pyo", line 60, in to_unicode_processor_factory
  File "codecs.pyo", line 930, in getdecoder
LookupError: unknown encoding: utf-8

In questo caso devo commetare l’opzione “ascii” del file di setup di py2exe

    setup_opts = {"py2exe": {"includes": explicit_incl,
                             "compressed": 1,
                             "optimize": 2,
                             #"ascii": 1,
                             "bundle_files": 1,}}

questo perchè la codifica “ascii” abilitata, vanifica il tentativo di utilizzo di altre codifiche (unknown encoding: utf-8)
Al terzo tentativo l’applicazione parte senza problemi.

Categorie:py2exe Tag:
I commenti sono chiusi.