Comment puis-je déboguer un py2exe « application n'a pas pu initialiser correctement » erreur?

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

  •  18-09-2019
  •  | 
  •  

Question

Je suis très nouveau pour Python en général, mais je fait une application en Python 2.6 / 2.8 wxPython qui fonctionne parfaitement quand je le lance à travers Python. Mais je voulais aller plus loin et être en mesure de déployer comme un exécutable Windows, donc je l'ai essayé sur py2exe. Mais je ne l'ai pas été en mesure de le faire fonctionner. Il serait toujours compiler un exe, mais lorsque je tente en fait de courir qu'il aboie un certain message d'erreur cryptique. Au début, ils étaient des messages simples en disant qu'il ne pouvait pas trouver certaines DLL, mais même après lui avoir donné toutes les DLL qu'il voulait, il retourne maintenant ceci:

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

Alors, je me suis cassé les choses et juste fait une très, application très simple en utilisant wxPython juste pour voir si cela fonctionne, ou si certaines des fonctionnalités plus complexes de mon application d'origine ont été de prendre le chemin. Mais même mon simple test retourné la même erreur. Voici le code pour le script de test simple:

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()

Et voici le script d'installation py2exe je:

#!/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"]

)

Alors je lance python setup.py py2exe, il génère le fichier EXE, met en garde contre certains fichiers DLL (que je copie ensuite dans le répertoire dist), mais quand je tente d'exécuter le fichier EXE, je reçois l'erreur que je citais ci-dessus immédiatement.

Était-ce utile?

La solution

Notez qu'il existe une version ultérieure de Visual C ++ 2008 package redistribuable: SP1 . Cependant, le SP1 et la version précédente ne pas installer les DLL dans le chemin. Comme la page de téléchargement dit (je souligne):

  

Ce package installe l'exécution   les composants de C Runtime (CRT),   C ++ standard, ATL, MFC, OpenMP et   bibliothèques MSDIA. Pour les bibliothèques qui   soutien côte-à-côte de modèle de déploiement   (CRT, SCL, ATL, MFC, OpenMP), ils sont   installé dans l'ensemble natif   cache, également appelé dossier WinSxS , sur   versions du système d'exploitation Windows   que les supports assemblées côte-à-côte.

Vous trouverez probablement ces fichiers dans le dossier %WINDIR%\WinSxS et non pas dans le path.What Je pense que vous devez faire est incorporer les informations manifeste pour les DLL pertinentes (dans %WINDIR%\WinSxS\Manifests) dans votre setup.py. je ajouter le suivant:

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

immédiatement après la section <dependency> existante, et reconstruit l'exe: il a couru sans problème. Remarque: en fonction exactement quelle version des fichiers Visual C ++ vous avez installé, les informations ci-dessus ne peut être tout à fait correct. Regardez les manifestes sur votre système et utiliser le version correct, publicKeyToken etc.

Vous pouvez également regarder cette réponse pour savoir comment déployer les DLL avec votre application (par opposition à supposer qu'ils existent déjà sur le système cible). Oh ... Je vois que vous posiez cette question originale; -)

Autres conseils

Votre question est: Comment puis-je déboguer py2exe

Voici une astuce:

En ce qui concerne votre problème, je pense que vous trouverez une solution sur ce fil plus complet traitant du même problème:

py2exe ne parvient pas à générer une exécutable

Je l'ai utilisé py2exe avant et je ne l'ai jamais couru à travers une telle situation ....

Cependant, il semble que les dépendances manquantes sont votre problème .....

Est-ce que le programme fonctionne emballé sur votre machine, mais pas sur d'autres?

Si, exécutez l'application emballés dans DEPENDS (marcheur de dépendance) sur les deux machines et comparer à discerner, espérons quels paquets ne s'inclus.

Bonne chance

Vous n'êtes pas censé copier tous les fichiers .dll qu'il se plaint! Certains d'entre eux sont des fichiers système Windows, et ils sont présents dans les bons endroits sur le système. Si vous les copiez dans le dossier dist, les choses ne fonctionnent pas correctement.

En général, vous voulez seulement copier .DLLs qui sont spécifiques à votre application. Pas système .DLLs. Dans certaines situations, vous devrez peut-être expédier vcredist_xx.exe dans votre installateur pour obtenir le temps d'exécution MSVC sur le système. Vous ne devriez jamais essayer d'expédier ces fichiers .dlls « brut » par vous-même. Utilisez le paquet Redist, il vous fera économiser du temps et de frustration.

Avez-vous essayé en suivant les instructions ici: http://wiki.wxpython.org/SmallApp ?

Êtes-vous sûr que vous donnez les mêmes que dll celui utilisé par wxPython.

Les VC ++ dll utilisés par wxpython peuvent être téléchargés à partir de la page de téléchargement de wxpython. Avez-vous essayé ces un?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top