如何调试py2exe“应用程序未正确初始化”的错误?

8 投票
4 回答
6176 浏览
提问于 2025-04-15 13:01

我对Python还很陌生,但我用Python 2.6和wxPython 2.8做了一个应用程序,运行得很好。但是我想更进一步,把它打包成一个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时,立刻就出现了我上面引用的错误。

4 个回答

0

你不需要把所有报错提到的 .dll 文件都复制过来!其中有些是Windows系统文件,它们已经在系统的正确位置了。如果你把它们复制到分发文件夹里,可能会导致程序无法正常运行。

一般来说,你只需要复制那些特定于你应用程序的 .dll 文件,而不是系统的 .dll 文件。在某些情况下,你可能需要在安装程序中包含 vcredist_xx.exe,以便在系统上安装 MSVC 运行时。你绝对不应该自己单独复制那些 .dll 文件。使用官方的重分发包,这样可以省去很多麻烦和时间。

你有没有试过按照这里的说明操作呢:http://wiki.wxpython.org/SmallApp

0

我之前用过py2exe,从来没有遇到过这样的情况……

不过,听起来你遇到的问题可能是缺少依赖项……

打包后的程序在你的电脑上能运行,但在其他电脑上不行吗?

如果是这样的话,可以在两台电脑上用DEPENDS(依赖项查看器)运行打包的应用程序,然后对比一下,看看哪些包没有被包含进来。

祝你好运!

10

注意,Visual C++ 2008 重新分发包有一个更新版本:SP1。不过,SP1和之前的版本都不会把DLL文件安装到系统路径里。正如下载页面所说(我强调的部分):

这个包安装了C运行时(CRT)、标准C++、ATL、MFC、OpenMP和MSDIA库的运行时组件。对于支持并行部署模型的库(CRT、SCL、ATL、MFC、OpenMP),它们会被安装到本地程序集缓存,也叫WinSxS文件夹,在支持并行程序集的Windows操作系统版本上。

你可能会在%WINDIR%\WinSxS文件夹里找到这些文件,而不是在系统路径中。我认为你需要把相关DLL的清单信息(在%WINDIR%\WinSxS\Manifests中找到)整合到你的setup.py里。我在现有的<dependency>部分后面添加了以下内容:

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

然后重新构建了exe文件:它运行得很好。注意:根据你安装的Visual C++文件的具体版本,上面的信息可能不完全正确。查看你系统上的清单,使用正确的versionpublicKeyToken等。

另外,可以查看这个回答,了解如何将DLL与应用程序一起部署(而不是假设它们已经存在于目标系统上)。哦……我看到你问了那个原始问题;-)

撰写回答