Come posso eseguire il debug dell'errore "Impossibile inizializzare correttamente l'applicazione py2exe"?

StackOverflow https://stackoverflow.com/questions/1153643

  •  18-09-2019
  •  | 
  •  

Domanda

Sono molto nuovo in Python in generale, ma ho creato un'app in Python 2.6 / wxPython 2.8 che funziona perfettamente quando la eseguo tramite Python.Ma volevo fare un ulteriore passo avanti ed essere in grado di distribuirlo come eseguibile di Windows, quindi ho provato py2exe.Ma non sono riuscito a farlo funzionare.Compilava sempre un exe, ma quando provo effettivamente a eseguirlo abbaia un messaggio di errore criptico.All'inizio erano semplici messaggi che dicevano che non riusciva a trovare alcune DLL, ma anche dopo aver fornito tutte le DLL che voleva, ora restituisce questo:

The application failed to initialize properly (0xc0000142).
Click OK to terminate the application.

Quindi ho analizzato le cose e ho creato un'applicazione molto, molto semplice utilizzando wxPython solo per vedere se avrebbe funzionato o se alcune delle funzionalità più complicate della mia app originale fossero d'intralcio.Ma anche il mio semplice test ha restituito lo stesso errore.Ecco il codice per il semplice script di test:

import wx

class MainWindow(wx.Frame):

    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, wx.ID_ANY, title, style=wx.DEFAULT_FRAME_STYLE ^ wx.MAXIMIZE_BOX)
        panel = wx.Panel(self, -1, style = wx.TAB_TRAVERSAL | wx.CLIP_CHILDREN | wx.FULL_REPAINT_ON_RESIZE)
        main_sizer = wx.BoxSizer(wx.VERTICAL)

        testtxt = wx.StaticText(panel, -1, label='This is a test!')
        main_sizer.Add(testtxt, 0, wx.ALIGN_CENTER)

        panel.SetSizerAndFit(main_sizer)
        self.Show(1)
        return

app = wx.PySimpleApp()
frame = MainWindow(None, -1, 'Test App')
app.MainLoop()

Ed ecco lo script di installazione di py2exe che ho usato:

#!/usr/bin/python

from distutils.core import setup
import py2exe

manifest = """
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
    version="0.64.1.0"
    processorArchitecture="x86"
    name="Controls"
    type="win32"
/>
<description>Test Program</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>
"""

setup(
    windows = [
        {
            "script": "testme.py",
            "icon_resources": [(1, "testme.ico")],
            "other_resources": [(24,1, manifest)]
        }
    ],
  data_files=["testme.ico"]

)

Poi corro python setup.py py2exe, genera il file EXE, avvisa di alcuni file DLL (che successivamente copio nella directory dist), ma quando provo a eseguire l'EXE, ricevo immediatamente l'errore che ho citato sopra.

È stato utile?

Soluzione

Tieni presente che esiste una versione successiva del pacchetto ridistribuibile di Visual C++ 2008: SP1.Tuttavia, sia SP1 che la versione precedente non installano le DLL nel percorso.Come dice la pagina di download (enfasi mia):

Questo pacchetto installa i componenti di runtime di C -Libraries C di Runtime (CRT), Standard C ++, ATL, MFC, OpenMP e MSDIA.Per le librerie che supportano il modello di distribuzione fianco a fianco (CRT, SCL, ATL, MFC, OpenMP) sono installate nella cache dell'assembly nativa, chiamata anche cartella Winsxs, sulle versioni del sistema operativo Windows che supportano assiemi fianco a fianco.

Probabilmente troverai questi file nel file %WINDIR%\WinSxS cartella e non nel percorso. Quello che penso che tu debba fare è incorporare le informazioni manifest per le DLL pertinenti (che si trovano in %WINDIR%\WinSxS\Manifests) nel tuo setup.py.Ho aggiunto la sezione seguente:

<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.VC90.CRT"
            version="9.0.30729.4918"
            processorArchitecture="X86"
            publicKeyToken="1fc8b3b9a1e18e3b"
            language="*"
        />
    </dependentAssembly>
</dependency>

immediatamente dopo l'esistente <dependency> sezione e ricostruito l'exe:ha funzionato senza problemi. Nota: a seconda della versione dei file Visual C++ installata, le informazioni precedenti potrebbero non essere esattamente corrette.Guarda i manifest sul tuo sistema e usa il file corretto version, publicKeyToken eccetera.

In alternativa, guarda questa risposta su come distribuire le DLL con l'applicazione (invece di presupporre che esistano già sul sistema di destinazione).OH ...Vedo che hai fatto la domanda originale ;-)

Altri suggerimenti

La tua domanda è: come faccio il debug py2exe

Ecco un suggerimento:

Per quanto riguarda il tuo problema specifico, mi aspetto che troverete una soluzione su questa discussione più completa che fare con lo stesso problema:

py2exe non riesce a generare un eseguibile

Ho usato py2exe prima e non ho mai imbattuto in una situazione come questa ....

Tuttavia, sembra che le dipendenze mancanti sono il tuo problema .....

funziona il programma confezionato sulla vostra macchina, ma non su altri?

In tal caso, eseguire l'applicazione confezionato entro DEPENDS (Dependency Walker) su entrambe le macchine e confrontare spera discernere quali pacchetti non essere inclusi.

Buona fortuna

Non sono tenuti a copiare tutti i DLL si lamenta! Alcuni di loro sono i file di sistema di Windows, e sono presenti nei posti corretti sul sistema. Se li si copia nella cartella dist, le cose non funzioneranno correttamente.

In generale, si desidera solo copiare DLL che sono specifici per l'applicazione. Non DLL di sistema. In alcune situazioni potrebbe essere necessario spedire vcredist_xx.exe nel vostro installatore per ottenere il runtime MSVC sul sistema. Non si dovrebbe mai cercare di spedire i file .dlls "grezzo" da soli. Utilizzare il pacchetto redist, che vi farà risparmiare tempo e frustrazione.

Hai provato seguendo le indicazioni qui: http://wiki.wxpython.org/SmallApp ?

Sei sicuro che ti danno le stesse DLL che quello usato da wxPython.

Le DLL di VC ++ utilizzati da wxpython possono essere scaricati dalla pagina wxPython download. Hai provato questi uno?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top