一般来说,我对 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 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++ 文件的具体版本,上述信息可能不完全正确。查看系统上的清单并使用正确的 version, publicKeyToken ETC。

或者,看看 这个答案 了解如何将 DLL 与您的应用程序一起部署(而不是假设它们已存在于目标系统上)。哦 ...我看到你问了原来的问题;-)

其他提示

你的问题是:我怎么试py2exe

这里是一个提示:

作为你的具体问题,我希望,你将找到一个解决方案这种更完整的螺纹处理同样的问题:

py2exe无法生成可执行

我用py2exe之前,我从来没有穿过的情况下这样运行了....

然而,这听起来像缺少的依赖关系是你的问题......

请问包装工作方案的计算机上,但不能在其他人?

如果是这样,运行在两台机器上DEPENDS(Dependency Walker中)内打包的应用程序,并比较希望能辨别哪些软件包没有得到包括在内。

好运

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

在一般情况下,你只需要复制的.dll这是特定于应用程序。没有系统的.dll。在某些情况下,你可能需要运输vcredist_xx.exe在您的安装以获得对系统的运行MSVC。你不应该试图自己把那些文件的.dll“原始”。使用REDIST包,这将节省您的时间和挫折。

您是否尝试过这里的路线如下: http://wiki.wxpython.org/SmallApp

您确定你给使用wxPython的一个相同的dll。

由wxPython中所用的VC ++的DLL可以从wxPython的下载页面下载。您是否尝试过这些吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top