如何调试py2exe“应用无法正确初始化”错误?
问题内容:
一般来说,我对Python还是很陌生,但是我在Python 2.6 / wxPython
2.8中创建了一个应用程序,当我通过Python运行它时,它可以完美运行。但是我想更进一步,能够将其部署为Windows可执行文件,因此我一直在尝试py2exe。但是我一直无法使它工作。它总是会编译一个exe,但是当我实际尝试运行该文件时,它会发出一些神秘的错误消息。最初,它们是简单的消息,说它找不到某些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时,我立即收到上面引用的错误。
问题答案:
请注意,有更高版本的Visual C ++
2008可再发行组件包:SP1。但是,SP1和早期版本都不会将DLL安装到路径中。如下载页面所述(我的重点):
该软件包将安装C运行时(CRT),标准C
++,ATL,MFC,OpenMP和MSDIA库的运行时组件。对于支持并行部署模型(CRT,SCL,ATL,MFC,OpenMP)的库,它们将安装
在 支持并行程序集的Windows操作系统版本的 本机程序集缓存中,也称为WinSxS文件夹 。 。
您可能会在%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(而不是假设目标系统中已存在DLL)。哦…我看到你问了那个原始问题;-)