web-dev-qa-db-ja.com

pyinstaller実行可能ファイルをビルドするときに、アーキテクチャ(32ビットと64ビット)を制御できますか?

短い質問
pyinstaller実行可能ファイルをビルドするときに、アーキテクチャ(32ビットと64ビット)を制御/保証する方法はありますか?

背景
64ビットのサポートがないため、py2exeからpyinstallerに移行しました。また、小さな事柄のホストがあり、過去を探すのに苦労しています。したがって、その点について、私はnotに戻ることをお勧めします。 Python 2.7 64ビットを使用して2つのアプリケーションを開発しましたが、32ビットマシンで実行するとパフォーマンスの問題が発生します。

1つ目は単純なwxPython GUI(バージョン2.9)で、USBドライバーのWindows DLLファイルに接続します。これは64ビットのみのモジュールがないため、32ビットとして実行するのはかなり「安全」に見えます。ただし、32ビットWindows XPで実行しているこのアプリケーションは、USBデバイスと通信するときにパフォーマンスに恐ろしい問題があります。

2番目のアプリケーションははるかに大きく、アーキテクチャの問題への恐れから、まだビルドして実行することを試みていません。このアプリケーションには、64ビットのみのモジュール(psycopg2は1つ)が使用されています。 32ビットの実行可能ファイルとして実行するimpossibleの場合、これをビルドしようとするのは避けたいです。

現在の考え
Pythonを32ビットモードで強制してbuild.pyを実行することで、これが可能である(モジュールに32ビットサポートがある場合)と思います。これは意味がありますか?

更新
最初に作成したプログラムにいくつかのブレークスルーがありました。パフォーマンスの問題は、2台のマシンの速度にのみ基づいていることがわかりました。私の開発マシンは、USBデバイスを十分に速くポーリングするのに十分な電力を持っていましたが、はるかに遅いテストプラットフォーム(Windows XP)にはそれがありませんでした。

USBポートのポーリング方法を変更して、この問題を修正しました。これが修正されたので、両方のシステムでexeを実行できました。実行可能ファイルを単一のファイルとしてビルドしようとすると、新しい問題が発生しました。 pyinstallerのBuild.pyを実行すると、アプリの実行に必要なすべてのDLLが取り込まれます。これは最初はうまく機能しているように見えましたが、Windows 7 64ビットでビルドした単一のexeを実行しようとしたが、Windows XPでは実行されませんでした。USBドングルのDLLが有効なDLLとして認識されません。

単一のexeを両方のシステムで実行するために、最初に.specファイル(DLLスクリプトのように見える)からpythonを削除しようとしました。通常のpythonリスト修飾子を使用して、ビルドコマンドの前にインクルードのリストを変更できたので便利でした。私の望みは、DLLがexeの一時ディレクトリに見つからなかった場合、システムPATHにあることです。このアプローチmightは機能しますが、多くのエラーをスローせずに実行することはできませんでした。

私の2番目の試みは、Windows XPマシン(DLLを埋め込まれたまま)でアプリケーションをビルドして、Win XP DLL Windows 7で動作します。成功しました!この構成は適切に機能します。ただし、これは新しいOSで実行されている古いDLLにのみ依存するため、これが最善の解決策ではないと私は強く信じています。

30
Adam Lewis

Pyinstallerは、ビルドに使用したpythonに依存するバイナリを生成します。したがって、python 2.7 64ビットを使用する場合、私が知る限り、これは不可能です、32ビットの実行可能ファイルを生成します。これは、Pyinstallerがpython installのために64ビットであるすべてのモジュールとその依存関係(dll、pydsなど))をアーカイブするためです。

すでに述べたように、相互互換性の問題のため、32ビットのバイナリをビルドする方が適切です。おそらくあなたはあなたの質問をもっと指定することができます。

11
J_Zar

アプリケーションをビルドしていて、32ビットWindowsで正常に動作する場合は、64ビットバージョンを作成する必要はありません。 32ビットバージョンを作成して、両方のアーキテクチャで実行するだけです。 WOW64の目的は何ですか。

64ビットのみのライブラリまたは機能を使用する必要がある場合は、64ビットバージョンをビルドしてください。機能が64ビットのみの場合、32ビットバージョンをビルドしても意味がありません。

64ビットバージョンと32ビットバージョンの両方をビルドする唯一の理由は、64ビットウィンドウの増加したアドレス空間を利用することです。つまり1 GBまたは2 GBを超えるメモリを割り当てる場合。たとえば、画像編集アプリケーションやデータ操作アプリケーションなどです。次に、プラットフォームの制約内で32ビットプラットフォームで実行できますが、64ビットプラットフォームでは、より大きな画像またはより大量のデータを編集できます。

IOW、あなたのケースでは、@ Velociraptorsの提案に従い、32ビットでビルドしますpython 32ビットのexeをビルドしている場合。

7
Ben