Py2exe: errori post freeze
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.
Commenti recenti