35

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

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

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

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

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

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

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

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

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

4

3 に答える 3

14

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

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

于 2012-04-26T06:50:30.903 に答える
8

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

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

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

IOW、あなたの場合、@Velociraptorsの提案に従い、32ビットexeを構築している場合は32ビットpythonで構築してください。

于 2012-01-20T12:30:25.673 に答える
4

64 ビット システムで 32 ビット アプリケーションをビルドする場合、64 ビット バージョンの Python しかインストールされていない場合は、32 ビット バージョンの Python もインストールする必要があります。次に、次のように pyinstaller をその 32 ビット Python バージョンにインストールする必要があります。

path/to/32-bit/python -m pip install pyinstaller

その後、32 ビット バージョンの pyinstaller を実行して、次のように 32 ビット アプリケーションをビルドできます。

path/to/32-bit/pyinstaller your-app.py

Windows 10 では、 にpyinstaller.exeありC:\Users\<user>\AppData\Local\Programs\Python\Python<version>-32\Scripts\pyinstaller.exeます。

ご覧のとおり、ビルドするアプリケーションのアーキテクチャは、そのアプリケーションのビルドに使用する Python と pyinstaller のバージョンによって異なります。このようにして、たとえば、システムにインストールされている場合、Python バージョン 2.x からアプリケーションを構築することもできます。

于 2021-05-17T15:09:28.703 に答える