私がやろうとしているのは、異なるバージョンの Python がインストールされていたり、アプリに必要なパッケージが含まれていない可能性のあるリモート サーバーにコードを送信することです。
現在、そのような移植性を実現するには、インタープリタとコードを使用して再配置可能な仮想環境を構築する必要があります。このアプローチにはいくつかの問題があり (たとえば、--always-copy
期待どおりに動作しないため、多数のライブラリを仮想環境に手動でコピーする必要があります)、一般的に速度が遅くなります。
(理論上は)離れてPython 自体を静的にビルドします。
インタープリターとコードを 1 つのバイナリにパックし、アプリケーションをモジュールとして実行できるかどうか疑問に思っています。次のようなものです:./mypython -m myapp run
または./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application
。
ベストアンサー1
問題を解決するには2つの方法があります
- 静的ビルダー(freeze、、
pyinstaller
など)を使用するpy2exe
- コンパイルするには
cython
この回答では、2番目の方法を使用してそれを実行する方法について説明します。最初の方法はクロスプラットフォームとバージョンではなく、他の回答で説明されています。また、pyinstallerなどのプログラムを使用すると、通常、ファイルサイズが非常に大きくなりますが、cythonを使用すると、はるかに小さなファイルになります。
まず、 をインストールします
cython
。sudo -H pip3 install cython
cython
次に、 PythonファイルからCファイルを生成するために使用できます.py
(https://stackoverflow.com/a/22040484/5714445)cython example_file.py --embed
現在の 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
これで、あなたが探しているバイナリファイルが作成されます。
その他注意事項:
example_file.py
実際にコンパイルしようとしているファイルに変更します。- Cython は、静的メモリ割り当てに C 型変数定義を使用して Python プログラムを高速化するために使用されます。ただし、この場合は、従来の Python 定義が引き続き使用されます。
- 追加のライブラリ( など)を使用している場合は
opencv
、 を使用してディレクトリを指定し-L
、 GCC フラグで を使用してライブラリの名前を指定する必要があります-l
。詳細については、 GCC フラグを参照してください。 - 上記の方法は、anaconda python では機能しない可能性があります。conda-python と互換性のあるバージョンの gcc をインストールする必要がある可能性が高いためです。