Como faço para depurar um py2exe 'aplicativo falha ao inicializar corretamente' erro?

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

  •  18-09-2019
  •  | 
  •  

Pergunta

Eu sou muito novo para Python em geral, mas eu fiz um aplicativo em Python 2.6 / wxPython 2.8 que funciona perfeitamente quando eu executá-lo através Python. Mas eu queria ir um passo mais longe e ser capaz de implantá-lo como um executável do Windows, então eu tenho tentado para fora py2exe. Mas eu não tenho sido capaz de fazê-lo funcionar. Seria sempre compilar um exe, mas quando eu realmente tentar executar que ele late alguma mensagem de erro enigmática. No início, eles eram simples mensagens dizendo que não poderia encontrar algumas DLLs, mas mesmo depois dando-lhe todas as DLLs que queria, ele agora retorna o seguinte:

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

Então, eu quebrei as coisas e acaba de fazer uma wxPython muito, aplicação muito simples utilizando apenas para ver se isso iria funcionar, ou se algumas das características mais complicado do meu aplicativo original foram ficando no caminho. Mas mesmo o meu teste simples devolveu o mesmo erro. Aqui está o código para o script de teste simples:

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

E aqui está o script de instalação py2exe eu usei:

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

)

Então eu corro python setup.py py2exe, gera o arquivo EXE, adverte sobre alguns arquivos DLL (que eu posteriormente copiar para o diretório dist), mas, em seguida, quando tento executar o EXE, eu recebo o erro que eu citei acima imediatamente.

Foi útil?

Solução

Note que há uma versão mais recente do 2008 pacote redistribuível Visual C ++: SP1 . No entanto, tanto o SP1 ea versão anterior não instalar as DLLs no caminho. Como a página de download diz (grifo meu):

Este pacote instala runtime componentes de tempo de execução C (CRT), Padrão C ++, ATL, MFC, e OpenMP bibliotecas MSDIA. Para bibliotecas que suporte lado-a-lado modelo de implantação (CRT, SCL, ATL, MFC, OpenMP) são instalado na montagem nativa cache, também chamados de WinSxS pasta , em versões do sistema operacional Windows que suporte lado-a-lado conjuntos.

Você provavelmente vai encontrar esses arquivos na pasta %WINDIR%\WinSxS e não no path.What Eu acho que você precisa fazer é incorporar a informação manifesto para as DLLs relevantes (encontrado em %WINDIR%\WinSxS\Manifests) em seu setup.py. Eu aditado o seguinte ponto:

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

imediatamente após a seção <dependency> existente, e reconstruiu o exe: ele correu sem problemas. Nota: dependendo exatamente qual versão do Visual C ++ arquivos instalados, a informação acima pode estar exatamente correto. Olhe para os manifestos em seu sistema e usar o version correta, publicKeyToken etc.

Como alternativa, olhada esta resposta para saber como implantar as DLLs com o seu aplicativo (em oposição ao supondo que eles já existem no sistema de destino). Oh ... Vejo que você fez essa pergunta original; -)

Outras dicas

Eu usei py2exe antes e eu nunca correr em uma situação como esta ....

No entanto, parece que as dependências faltando é o seu problema .....

Será que o programa funcione embalados em sua máquina, mas não em outros?

Se assim for, execute o aplicativo embalados dentro de DEPENDS (dependência walker) em ambas as máquinas e comparar com esperamos discernir quais pacotes não são incluídos.

Good Luck

Você não é suposto para copiar todos os .dlls ele se queixa! Alguns deles são arquivos de sistema do Windows, e eles estão presentes nos lugares corretos no sistema. Se você copiá-los para a pasta dist, as coisas não irá funcionar corretamente.

Em geral, você só quer copiar .dlls que são específicos para sua aplicação. Nem .dlls sistema. Em algumas situações pode ser necessário enviar vcredist_xx.exe em seu instalador para obter o tempo de execução MSVC no sistema. Você nunca deve tentar enviar esses arquivos .dll "raw" por si mesmo. Use o pacote redist, ela vai lhe poupar tempo e frustração.

Você já tentou seguir as instruções aqui: http://wiki.wxpython.org/SmallApp ?

Você tem certeza que você dá as mesmas DLLs que o utilizado pelo wxPython.

As DLLs VC ++ usados ??por wxpython pode ser baixado da página wxpython download. Você tentou estes um?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top