Как отладить py2exe-приложение «ошибка при инициализации»? - PullRequest
7 голосов
/ 20 июля 2009

Я очень новичок в Python в целом, но я создал приложение на Python 2.6 / wxPython 2.8, которое отлично работает, когда я запускаю его через Python. Но я хотел пойти дальше и иметь возможность развернуть его как исполняемый файл Windows, поэтому я пробовал py2exe. Но я не смог заставить его работать. Он всегда компилирует исполняемый файл, но когда я на самом деле пытаюсь его запустить, он лает какое-то загадочное сообщение об ошибке. Сначала они были простыми сообщениями о том, что не могут найти определенные библиотеки DLL, но даже после предоставления всех требуемых библиотек DLL теперь возвращает следующее:

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

Итак, я разбил все на части и просто создал очень, очень простое приложение, использующее wxPython, просто чтобы посмотреть, сработает ли это, или мешают некоторые из более сложных функций моего исходного приложения. Но даже мой простой тест вернул ту же ошибку. Вот код для простого тестового скрипта:

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

А вот скрипт установки py2exe, который я использовал:

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

)

Затем я запускаю python setup.py py2exe, он генерирует EXE-файл, предупреждает о некоторых DLL-файлах (которые я впоследствии копирую в каталог dist), но затем, когда я пытаюсь запустить EXE, я сразу получаю сообщение об ошибке, приведенное выше. .

Ответы [ 5 ]

10 голосов
/ 20 июля 2009

Обратите внимание, что существует более поздняя версия распространяемого пакета Visual C ++ 2008: SP1 . Однако и SP1, и более ранняя версия не устанавливают библиотеки DLL в путь. Как сказано на странице загрузки (мой акцент):

Этот пакет устанавливает среду выполнения компоненты C Runtime (CRT), Стандарт C ++, ATL, MFC, OpenMP и Библиотеки MSDIA. Для библиотек, которые поддержка параллельной модели развертывания (CRT, SCL, ATL, MFC, OpenMP) они установил в родную сборку кеш, также называемый папкой WinSxS , на версии операционной системы Windows которые поддерживают бок о бок сборки.

Вероятно, вы найдете эти файлы в папке %WINDIR%\WinSxS, а не в пути. Я думаю, вам нужно включить информацию манифеста для соответствующих библиотек DLL (находится в %WINDIR%\WinSxS\Manifests) в ваш setup.py. я добавлен следующий раздел:

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

сразу после существующего раздела <dependency> и перестроил исполняемый файл: он запустился без проблем. Примечание: в зависимости от того, какую именно версию файлов Visual C ++ вы установили, приведенная выше информация может быть не совсем правильной. Посмотрите на манифесты в вашей системе и используйте правильные version, publicKeyToken и т. Д.

В качестве альтернативы посмотрите на этот ответ , чтобы узнать, как развернуть библиотеки DLL с вашим приложением (в отличие от предположения, что они уже существуют в целевой системе). Ох ... я вижу, вы задали этот оригинальный вопрос; -)

1 голос
/ 15 октября 2009

Ваш вопрос был: Как мне отладить py2exe

Вот совет:

Что касается вашей конкретной проблемы, я ожидаю, что вы найдете решение в этом более полном потоке, посвященном той же проблеме:

py2exe не может создать исполняемый файл

0 голосов
/ 20 июля 2009

Вы не должны копировать ВСЕ DLL-файлы, на которые он жалуется! Некоторые из них являются системными файлами Windows, и они присутствуют в правильных местах в системе. Если вы скопируете их в папку dist, все будет работать некорректно.

Как правило, вы хотите копировать только DLL-файлы, относящиеся к вашему приложению. Не системные .dll. В некоторых ситуациях вам может понадобиться загрузить vcredist_xx.exe в вашем установщике, чтобы получить среду выполнения MSVC в системе. Вы никогда не должны пытаться отправить эти файлы .dll «сырые» самостоятельно. Используйте пакет redist, это сэкономит ваше время и разочарование.

Вы пробовали, следуя указаниям здесь: http://wiki.wxpython.org/SmallApp?

0 голосов
/ 20 июля 2009

Вы уверены, что даете те же самые DLL, что и wxPython.

Библиотеки vc ++, используемые wxpython, можно загрузить со страницы загрузки wxpython. Вы пробовали это?

0 голосов
/ 20 июля 2009

Я раньше использовал py2exe и никогда не сталкивался с подобной ситуацией ....

Тем не менее, похоже, что проблема заключается в отсутствии зависимостей .....

Работает ли упакованная программа на вашем компьютере, но не на других?

Если это так, запустите упакованное приложение в DEPENDS (средство обхода зависимостей) на обеих машинах и сравните, чтобы определить, какие пакеты не были включены.

Удачи

...