Comment puis-je déboguer un py2exe « application n'a pas pu initialiser correctement » erreur?
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.
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?