Как отладить py2exe-приложение "ошибка при инициализации"?
Я вообще новичок в 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 ответов
Обратите внимание, что существует более поздняя версия распространяемого пакета Visual C++ 2008: SP1. Однако и SP1, и более ранняя версия не устанавливают библиотеки DLL в путь. Как говорит страница загрузки (мой акцент):
Этот пакет устанавливает компоненты среды выполнения библиотек C Runtime (CRT), Standard 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>
раздел и перестроил exe: он запустился без проблем. Примечание: в зависимости от того, какую именно версию файлов Visual C++ вы установили, приведенная выше информация может быть не совсем правильной. Посмотрите на манифесты в вашей системе и используйте правильные version
, publicKeyToken
и т.п.
В качестве альтернативы посмотрите на этот ответ, чтобы узнать, как развернуть библиотеки DLL с вашим приложением (в отличие от предположения, что они уже существуют в целевой системе). Ох... я вижу, вы задали этот оригинальный вопрос;-)
Ваш вопрос был: Как мне отладить py2exe
Вот совет:
- Используйте ходок зависимостей
Что касается вашей конкретной проблемы, я ожидаю, что вы найдете решение в этом более полном потоке, посвященном той же проблеме:
Вы уверены, что даете те же самые библиотеки, что и wxPython?
Библиотеки vC++, используемые wxpython, можно загрузить со страницы загрузки wxpython. Вы пробовали это?
Вы не должны копировать ВСЕ DLL-файлы, на которые он жалуется! Некоторые из них являются системными файлами Windows, и они присутствуют в правильных местах в системе. Если вы скопируете их в папку dist, все будет работать некорректно.
В общем, вы хотите копировать только.dll, которые являются специфическими для вашего приложения. Не системные.dll. В некоторых ситуациях вам может потребоваться загрузить vcredist_xx.exe в вашем установщике, чтобы получить среду выполнения MSVC в системе. Вы никогда не должны пытаться отправить эти файлы.dll "сырые" самостоятельно. Используйте пакет redist, это сэкономит ваше время и разочарование.
Вы пробовали следовать указаниям здесь: http://wiki.wxpython.org/SmallApp?
Я использовал py2exe раньше, и я никогда не сталкивался с такой ситуацией....
Тем не менее, кажется, что отсутствие зависимостей - ваша проблема.....
Работает ли упакованная программа на вашем компьютере, а не на других?
Если это так, запустите упакованное приложение в DEPENDS (средство обхода зависимостей) на обеих машинах и сравните, чтобы определить, какие пакеты не были включены.
Удачи