7

私は一般的に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を実行しようとすると、すぐに上記のエラーが発生します。

4

4 に答える 4

10

Visual C++ 2008 Redistributable パッケージの新しいバージョン 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 を展開する方法については、この回答を参照してください (ターゲット システムに既に存在すると仮定するのではなく)。ああ...私はあなたがその元の質問をしたのを見ます;-)

于 2009-07-20T17:11:13.750 に答える
0

wxPythonで使用されているものと同じdllを指定してください。

wxpythonで使用されるvc++dllは、wxpythonダウンロードページからダウンロードできます。これらを試しましたか?

于 2009-07-20T15:04:14.707 に答える
0

以前にpy2exeを使用したことがありますが、このような状況に遭遇したことはありません....

ただし、依存関係の欠落が問題のようです.....

パッケージ化されたプログラムはあなたのマシンでは動作しますが、他のマシンでは動作しませんか?

その場合は、両方のマシンの DEPENDS (依存関係ウォーカー) 内でパッケージ化されたアプリケーションを実行し、比較して、含まれていないパッケージを識別してください。

幸運を

于 2009-07-20T13:54:20.687 に答える
0

問題のある .dll をすべてコピーすることは想定されていません。それらの一部は Windows システム ファイルであり、システム上の適切な場所に存在します。これらを dist フォルダーにコピーすると、正しく動作しません。

一般に、アプリケーションに固有の .dll のみをコピーする必要があります。システム .dll ではありません。システムで MSVC ランタイムを取得するために、インストーラーに vcredist_xx.exe を同梱する必要がある場合があります。これらの .dll ファイルを自分で「未加工」で出荷しようとしないでください。redist パッケージを使用すると、時間とフラストレーションが軽減されます。

http://wiki.wxpython.org/SmallAppの指示に従ってみましたか?

于 2009-07-20T14:17:17.917 に答える