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からのエラーメッセージがない場合、何が起こるかわかりません。
プログラムの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再頒布可能パッケージ をダウンロードしてインストールすることをお勧めします。
これをすべてのsetup.pyスクリプトに追加しました。
distutils.core.setup(
options = {
"py2exe": {
"dll_excludes": ["MSVCP90.dll"]
}
},
...
)
これにより、py2exeは静かになりますが、dllがユーザーのマシン上にあることを確認する必要があります。
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/
これは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」を追加します。
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
を見つけます。
ちょうどあなたの情報のために、私にとってはファイルをコピーするのに役立ちました
Microsoft.VC90.CRT.manifest msvcr90.dll
ユーザーのマシン上の.exeがあるディレクトリに(pythonまたはVC redistributableがインストールされていない)。
ここにあるすべてのヒントをありがとう!
出力には、WXを使用していることが示されています。コンソールではなくGUIアプリとして指定されたスクリプトでpy2exeを実行してみてください。間違っていなければ、py2exeで問題が発生する傾向があります。
これを試してください: http://www.py2exe.org/index.cgi/Tutorial#Step52
それは私のために働いた