Python アプリケーションを静的バイナリにコンパイルする方法はありますか? 質問する

Python アプリケーションを静的バイナリにコンパイルする方法はありますか? 質問する

私がやろうとしているのは、異なるバージョンの Python がインストールされていたり、アプリに必要なパッケージが含まれていない可能性のあるリモート サーバーにコードを送信することです。

現在、そのような移植性を実現するには、インタープリタとコードを使用して再配置可能な仮想環境を構築する必要があります。このアプローチにはいくつかの問題があり (たとえば、--always-copy期待どおりに動作しないため、多数のライブラリを仮想環境に手動でコピーする必要があります)、一般的に速度が遅くなります。

(理論上は)離れてPython 自体を静的にビルドします。

インタープリターとコードを 1 つのバイナリにパックし、アプリケーションをモジュールとして実行できるかどうか疑問に思っています。次のようなものです:./mypython -m myapp runまたは./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application

ベストアンサー1

問題を解決するには2つの方法があります

  1. 静的ビルダー(freeze、、pyinstallerなど)を使用するpy2exe
  2. コンパイルするにはcython

この回答では、2番目の方法を使用してそれを実行する方法について説明します。最初の方法はクロスプラットフォームとバージョンではなく、他の回答で説明されています。また、pyinstallerなどのプログラムを使用すると、通常、ファイルサイズが非常に大きくなりますが、cythonを使用すると、はるかに小さなファイルになります。

  1. まず、 をインストールしますcython

    sudo -H pip3 install cython
    
  2. cython次に、 PythonファイルからCファイルを生成するために使用できます.pyhttps://stackoverflow.com/a/22040484/5714445

    cython example_file.py --embed
    
  3. 現在の Python バージョンを取得した後、GCC を使用してコンパイルします (注: 以下では、Python3 にコンパイルしようとしていることを前提としています)

    PYTHONLIBVER=python$(python3 -c 'import sys; print(".".join(map(str, sys.version_info[:2])))')$(python3-config --abiflags)
    gcc -Os $(python3-config --includes) example_file.c -o output_bin_file $(python3-config --ldflags) -l$PYTHONLIBVER
    

output_bin_fileこれで、あなたが探しているバイナリファイルが作成されます。

その他注意事項:

  1. example_file.py実際にコンパイルしようとしているファイルに変更します。
  2. Cython は、静的メモリ割り当てに C 型変数定義を使用して Python プログラムを高速化するために使用されます。ただし、この場合は、従来の Python 定義が引き続き使用されます。
  3. 追加のライブラリ( など)を使用している場合はopencv、 を使用してディレクトリを指定し-L、 GCC フラグで を使用してライブラリの名前を指定する必要があります-l。詳細については、 GCC フラグを参照してください。
  4. 上記の方法は、anaconda python では機能しない可能性があります。conda-python と互換性のあるバージョンの gcc をインストールする必要がある可能性が高いためです。

おすすめ記事