web-dev-qa-db-ja.com

py2exeは実行可能ファイルの生成に失敗します

XPでpython 2.6を使用しています。py2exeをインストールしたばかりで、hello.pyから簡単なhello.exeを正常に作成できます。ただし、実際のプログラムでpy2exeを使用しようとすると、py2exeはいくつかの情報メッセージを生成しますが、distフォルダーには何も生成できません。

私のsetup.pyは次のようになります。

from distutils.core import setup
import py2exe

setup(console=['ServerManager.py'])

py2exeの出力は次のようになります。

python setup.py py2exe
running py2exe
creating C:\DevSource\Scripts\ServerManager\build
creating C:\DevSource\Scripts\ServerManager\build\bdist.win32
   ...
   ...
creating C:\DevSource\Scripts\ServerManager\dist
*** searching for required modules ***
*** parsing results ***
creating python loader for extension 'wx._misc_' (C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_misc_.pyd -> wx._misc_.pyd)
creating python loader for extension 'lxml.etree' (C:\Python26\lib\site-packages\lxml\etree.pyd -> lxml.etree.pyd)
   ...
   ...
creating python loader for extension 'bz2' (C:\Python26\DLLs\bz2.pyd -> bz2.pyd)
*** finding dlls needed ***

py2exeがすべてのインポートを見つけたようです(明示的にインポートしていないので、win32が言及されているのを見て少し驚きました)。また、私のプログラムは次のコマンドで非常に楽しく起動します。

python ServerManager.py

明らかに、根本的に間違ったことをしているのですが、py2exeからのエラーメッセージがない場合、何が起こるかわかりません。

51

プログラムのwxPythonを使用する部分をコメントアウトすると、py2exeが正常に機能することがわかりました。また、ダウンロードに付属する「シンプルな」サンプル(つまり、Python26\Lib\site-packages\py2exe\samples\simple)でpy2exeを使用すると、次のエラーメッセージが表示されます。

*** finding dlls needed ***
error: MSVCP90.dll: No such file or directory

したがって、wxPythonについての何かが、py2exeにVisual Studio 2008 DLLが必要だと思わせます。私はVS2008を持っていませんが、私のプログラムはPythonモジュールのディレクトリとして完璧に動作します。Web上でMSVCP90.DLLのコピーを見つけ、Python26/DLLにインストールしました。 py2exeが正常に動作するようになりました。

Py2exeがなくてもコードを完璧に実行できるため、この依存関係がどこから来たのかまだわかりません。また、py2exeがtest_wx.pyサンプルで行ったようなエラーメッセージを表示しなかったのも面倒です。

更なる更新:別のPCでpy2exeからの出力を実行しようとすると、MSVCR90.DLLをインストールする必要があることがわかりました。したがって、ターゲットPCにVisual C++ 2008がまだインストールされていない場合は、 Microsoft Visual C++ 2008再頒布可能パッケージ をダウンロードしてインストールすることをお勧めします。

40

これをすべてのsetup.pyスクリプトに追加しました。

distutils.core.setup(
    options = {
        "py2exe": {
            "dll_excludes": ["MSVCP90.dll"]
        }
    },
    ...
)

これにより、py2exeは静かになりますが、dllがユーザーのマシン上にあることを確認する必要があります。

41
Bill

wxPythonはそれとは何の関係もありません。以前のPython 2.6、Pythonは、WindowsコンパイラとしてVisual Studio 2003を使用しました。2.6から、Visual Studio 2008に切り替えました。次のリンクを参照してください。

http://wiki.wxpython.org/py2exe

http://py2exe.org/index.cgi/Tutorial#Step52

また、py2exeを使用してwxPythonアプリケーションを作成する場合は、コンソールではなくwindowsパラメーターを設定します。たぶん私のチュートリアルはあなたを助けるでしょう:

http://www.blog.pythonlibrary.org/2010/07/31/a-py2exe-tutorial-build-a-binary-series/

9
Mike Driscoll

これはPython 2.6の依存関係にすぎないようです。2.5でこのエラーは発生していませんでしたが、アップグレード後は私はそうです。

このメールスレッドには、問題が存在する理由と修正方法についての背景があります。
http://www.nabble.com/py2exe,-Py26,-wxPython-and-dll-td20556399.html

Vcredistをインストールする必要はありませんでした。現在、私のアプリケーションはインストールする必要がなく、管理者以外でも実行できます。これは私が失いたくない振る舞いです。だから私はリンクの提案に従い、必要なMicrosoft.VC90.CRT.manifestとmsvcr90.dllをPython "for this user only"をインストールすることで取得しました。 「すべてのユーザー」のWinSxSフォルダーで見つかりましたPython 2.6インストール。3つのうち2つを既に持っているので、すぐに取得できませんでしたが、将来のエラーを防ぐためにmsvcm90.dllマニフェストと3つのDLLを、凍結したアプリケーションが使用するlibsフォルダーに入れました。

私が実行しなければならなかったトリックは、マニフェストとmsvcr90.dllの追加コピーを、py2exeで生成された実行可能ファイルの隣にあるアプリケーションフォルダーのルートに含めることでした。このDLL=のコピーは、アプリケーションをbootstrap=に使用しますが、libsフォルダーのみを見るように見えます。

発見が他の誰かの助けになることを願っています。

また、py2exeに実際のエラーメッセージを記録させるのと同じ問題がありました。それから、stderrがログファイルにリダイレクトされないことに気付きました。 py2exeを呼び出すコマンドラインに「> build.log 2>&1」を追加します。

6
resplin
import sys

sys.path.append('C:\\WINDOWS\\WinSxS\\x86_Microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_5090ab56bcba71c2')

各Windowsでは、MSVCP90.dllのサブディレクトリにC:\\WINDOWS\\WinSxS\\ファイルがあります。

私の場合、ディレクトリはx86_Microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_5090ab56bcba71c2でした。

C:\\WINDOWS\\WinSxS\\に移動し、Windowsファイル検索を使用してMSVCP90.dllを見つけます。

6
Egor

ちょうどあなたの情報のために、私にとってはファイルをコピーするのに役立ちました

Microsoft.VC90.CRT.manifest msvcr90.dll

ユーザーのマシン上の.exeがあるディレクトリに(pythonまたはVC redistributableがインストールされていない)。

ここにあるすべてのヒントをありがとう!

3
george

出力には、WXを使用していることが示されています。コンソールではなくGUIアプリとして指定されたスクリプトでpy2exeを実行してみてください。間違っていなければ、py2exeで問題が発生する傾向があります。

1
sli

これを試してください: http://www.py2exe.org/index.cgi/Tutorial#Step52

それは私のために働いた

1
bazzinga