如何调试py2exe'应用程序无法正确初始化'错误?

时间:2009-07-20 13:37:09

标签: python wxpython 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时,我得到了引用的错误立即上面。

5 个答案:

答案 0 :(得分:10)

请注意,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>

在现有<dependency>部分之后立即重建exe:它运行没有问题。 注意:取决于您安装的Visual C ++文件的确切版本,上述信息可能不完全正确。查看系统上的清单,并使用正确的versionpublicKeyToken

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

答案 1 :(得分:1)

你的问题是:我如何调试py2exe

这是一个提示:

至于你的具体问题,我希望你会在这个更完整的线程上找到解决同样问题的解决方案:

py2exe fails to generate an executable

答案 2 :(得分:0)

我之前使用过py2exe,而且我从来没有碰过这样的情况......

然而,听起来缺少依赖性是你的问题.....

打包的程序是否适用于您的计算机而不适用于其他程序?

如果是这样,请在两台计算机上的DEPENDS(依赖性walker)中运行打包的应用程序并进行比较,以便能够识别哪些包未包含在内。

祝你好运

答案 3 :(得分:0)

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

通常,您只想复制特定于您的应用程序的.dll。不是系统.dlls。在某些情况下,您可能需要在安装程序中运送vcredist_xx.exe以获取系统上的MSVC运行时。你永远不应该试图自己发送那些.dll文件“raw”。使用redist包,它将为您节省时间和挫折。

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

答案 4 :(得分:0)

你确定你提供的是与wxPython使用的dll相同的dll。

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