web-dev-qa-db-ja.com

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

私がやろうとしていることは、コードをリモートサーバーに出荷することです。リモートサーバーには、異なるpythonバージョンがインストールされているか、アプリに必要なパッケージがない場合があります。

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

(理論上) a way があり、python自体を静的にビルドします。

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

56
roboslone

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

  1. フリーズ、pyinstaller、py2exeなどの静的ビルダーを使用します
  2. Cythonを使用してコンパイルする

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

まず、cythonをインストールします。次に、pythonファイル(たとえばtest.py)の名前をpyxファイルに変更します

$ Sudo pip install cython
$ mv test.py test.pyx

次に、GCCと一緒にcythonを使用してコンパイルします(CythonはPython .pyxファイルからCファイルを生成し、GCCがCファイルをコンパイルします)( https: //stackoverflow.com/a/22040484/5714445

$ cython test.pyx --embed
$ gcc -Os -I /usr/include/python3.5m -o test test.c -lpython3.5m -lpthread -lm -lutil -ldl

注:使用しているpythonのバージョンによっては、最後のコマンドを変更する必要がある場合があります。使用しているpythonのバージョンを知るには、単に使用します

$ python -V

これで、バイナリファイル「テスト」が得られます。これが探しているものです

注:Cythonは、Pythonプログラムを高速化するために、静的メモリ割り当てにCタイプ変数定義を使用するために使用されます。ただし、あなたのケースでは、従来のPython定義を引き続き使用します。

注2:追加のライブラリ(たとえば、opencvなど)を使用している場合、-Lを使用してそれらにディレクトリを提供し、GCCフラグで-lを使用してライブラリの名前を指定する必要があります。詳細については、GCCフラグを参照してください

68

Nuitka を調査することをお勧めします。 pythonソースコードを受け取り、C++ API呼び出しに変換します。次に、実行可能なバイナリ(LinuxのELF)にコンパイルします。数年前から存在し、広範囲のPythonバージョンをサポートしています。

使用すると、おそらくパフォーマンスも向上します。推奨。

5
Prakhar Agarwal

python実行可能ファイルを凍結してコードに沿って出荷するには、空のシェルアプリに埋め込みます。 公式ドキュメント からアプリケーションにpythonを埋め込む方法の指示に従ってください。 Webページで提供されるCサンプルコードから直接サンプルアプリの構築を開始できます。

そのプログラムに埋め込みpythonを介してpythonアプリケーションを実行させます。プログラム、使用した埋め込みpython、およびpythonプログラムを出荷します。そのプログラムを実行します。

0
Boud

おそらく、Freezeのようなものを探しているでしょう。Freezeは、Pythonアプリケーションとそのすべてのライブラリを静的バイナリにコンパイルできます。

フリーズのPyPiページ

FreezeのPython Wikiページ

FreezeのSourceforgeページ

0
asc11

Macを使用している場合は、py2appを使用して.appバンドルを作成できます。これにより、Djangoアプリをダブルクリックすると起動します。

DjangoとCherryPyを https://moosystems.com/articles/14-distribute-Django-app-as-native-にバンドルする方法を説明しましたdesktop-app-01.html

この記事では、pywebviewを使用してDjangoサイトをローカルアプリケーションウィンドウに表示します。

0
André Aulich

凍結オプション:

ただし、ターゲットサーバーには必要な環境が必要です->「作成」できるはずです。そうでない場合は、環境に合わせてソフトウェアを構築する必要があります。

Sshアクセスがあると仮定して、pythonのカスタムバージョンをvirtualenvにインストールする方法に関するこの便利なガイドを見つけました。 https://stackoverflow.com/a/5507373/561611

Virtualenvでは、pipをインストールでき、Sudo権限について心配する必要はありません。もちろん、それらを使用してaptのようなパッケージマネージャーにアクセスすると、すべてが非常に簡単になります。

0
iScrE4m