【问题标题】:How do I debug a py2exe 'application failed to initialize properly' error?如何调试 py2exe“应用程序无法正确初始化”错误?
【发布时间】:2009-07-20 13:37:08
【问题描述】:

总的来说,我对 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 时,我立即收到上面引用的错误.

【问题讨论】:

  • -1:可怕的问题标题。也许这应该是:“如何调试 py2exe '应用程序未能正确初始化'错误?”
  • 抱歉标题,S.Lott。现在已更改。

标签: python wxpython py2exe


【解决方案1】:

请注意,有更高版本的 Visual C++ 2008 Redistributable 包: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>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.VC90.CRT"
            version="9.0.30729.4918"
            processorArchitecture="X86"
            publicKeyToken="1fc8b3b9a1e18e3b"
            language="*"
        />
    </dependentAssembly>
</dependency>

在现有的&lt;dependency&gt; 部分之后立即重新构建 exe:它运行没有问题。 注意: 根据您安装的 Visual C++ 文件的具体版本,上述信息可能不完全正确。查看系统上的清单并使用正确的versionpublicKeyToken 等。

或者,查看this answer 以了解如何将 DLL 部署到您的应用程序中(而不是假设它们已经存在于目标系统上)。哦......我看到你问了那个原始问题;-)

【讨论】:

  • 添加 &lt;dependency&gt; 做到了!非常感谢!
  • 顺便说一下,给定一个DLL文件,你如何找到它的publicKeyToken?例如,我实际上有上述 DLL 的 9.0.30729.1 版本;我将如何为它获取正确的 publicKeyToken?
  • 在我之前提到的 Manifests 目录中查找您需要的特定清单。
【解决方案2】:

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

但是,听起来缺少依赖项是您的问题.....

打包的程序可以在你的机器上运行,但在其他机器上不行吗?

如果是这样,请在两台机器上的 DEPENDS(dependency walker)中运行打包的应用程序,并进行比较,希望能辨别出哪些包没有被包含在内。

祝你好运

【讨论】:

  • “打包程序”是指生成的exe吗?还是直接通过 Python 运行脚本?无论如何,如果我从命令行运行python testme.py,那就可以了。但是通过 py2exe 运行它的目的是我希望能够将它部署到 没有 安装 Python 的计算机上。但是现在,当我使用 py2exe 编译它时,它无法在 任何 计算机上运行,​​无论是否使用 Python。
  • 打包程序 = 生成的 Exe。 exe 应该在生成它的机器上运行良好。使用dependency walker 在该机器上运行它以查看加载的库的显式列表。然后转身在发生故障的机器上执行此操作。差异将为您指明解决方案。
  • 这一直是我的观点......打包的程序在生产它的机器上运行良好。因此标题。
  • 这个问题对我来说并不完全清楚。不过,您可以使用取决于应用程序来查看未成功加载的内容。
【解决方案3】:

您不应该复制它抱怨的所有 .dll!其中一些是 Windows 系统文件,它们存在于系统上的正确位置。如果你将它们复制到 dist 文件夹中,事情将无法正常工作。

一般来说,您只想复制特定于您的应用程序的 .dll。不是系统 .dll。在某些情况下,您可能需要在安装程序中提供 vcredist_xx.exe 以在系统上获取 MSVC 运行时。您永远不应该尝试自己“原始”地发送这些 .dlls 文件。使用 redist 包,它会节省您的时间和挫败感。

您是否尝试过按照此处的说明进行操作:http://wiki.wxpython.org/SmallApp

【讨论】:

  • 我尝试了这些方向,结果如下。 1.尝试运行python setup.py py2exe --icon=SmallApp.ico,得到这个错误:error: option --icon not recognized。 2. 尝试运行python setup.py py2exe,得到这个错误:error: error in setup.cfg: command 'py2exe' has no such option 'version_legalcopyright'。 3. 删除 setup.cfg 文件并尝试重新运行python setup.py py2exe,py2exe 出现 运行良好,它创建了包含文件的 build 和 dist 目录——除了它没有创建 EXE 文件在区! (除了 w9xpopen.exe,它自己什么都不做)
  • 4.修改了说明中的 setup.py 文件,以匹配我在上面的问题中发布的文件(除了将引用从 testme 更改为 smallapp),它编译得很好,产生了一个 EXE,但是它创建的 EXE有完全相同的错误:应用程序未能正确初始化。
  • 不确定在发布答案时是否是这种情况,但截至目前,VC 可再分发 dll 不被视为系统文件,应与使用它们的应用程序并排分发: support.microsoft.com/kb/326922
【解决方案4】:

您确定您提供的 dll 与 wxPython 使用的 dll 相同吗?

wxpython使用的vc++ dll可以从wxpython下载页面下载。你试过这些吗?

【讨论】:

  • 当我尝试在不复制 DLL 的情况下运行 EXE 时,我实际上得到了这个错误:这个应用程序无法启动,因为没有找到 MSVCR90.dll。重新安装应用程序可能会解决此问题。然后我将 msvcr90.dll 复制到 dist 文件夹并得到上面提到的“应用程序无法正确初始化”错误。 AFAIK,这个 DLL 来自 VC++ 包。
  • 您是否还安装了 Visual C++ 可再发行包?
  • 是的,我做到了——尤其是在我发布这个问题之前,我就安装了2008 package
猜你喜欢
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多