[解決済み] Pythonアプリケーションを静的バイナリにコンパイルする方法はありますか?
質問
私は自分のコードをリモートサーバーに送信しようとしています。リモートサーバーは異なるバージョンの python をインストールしているかもしれませんし、私のアプリが必要とするパッケージを持っていないかもしれません。
現在、そのような移植性を達成するために、私はインタプリタとコードで再配置可能な仮想環境を構築する必要があります。このアプローチにはいくつかの問題があります (例えば、多くのライブラリを手動で仮想環境にコピーする必要があります、なぜなら
--always-copy
は期待通りには動作しないので)、一般的に遅いです。
そこには (理論的には) 道 を使えば、python 自体を静的にビルドすることができます。
私は、インタプリタと私のコードを一つのバイナリにパックして、私のアプリケーションをモジュールとして実行することができないかと思います。そのようなものです。
./mypython -m myapp run
または
./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application
.
どのように解決するのですか?
問題を解決するには、2つの方法があります。
-
freeze のような静的ビルダーを使用するか、または
pyinstaller
のような静的ビルダーを使うか、あるいはpy2exe
-
を使ってコンパイルします。
cython
最初の方法は、クロスプラットフォームやバージョンではなく、他の回答で説明されているので、2番目の方法を使用して行うことができる方法を説明します。また、pyinstaller のようなプログラムを使用すると、通常、巨大なファイル サイズになり、cython を使用すると、ファイル サイズが KB になります。
まず、インストールします。
cython
. そして、Python ファイルの名前を変更します。
test.py
とします) を
.pyx
ファイル
sudo pip install cython
mv test.py test.pyx
次に
cython
と共に GCC を使ってコンパイルします (
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
これで、バイナリファイル 'test' ができあがりました。
その他の注意点 :
- Cythonは、Pythonプログラムを高速化するために、静的なメモリ割り当てのためのC-Type変数定義を使用するために使用されます。しかし、あなたのケースでは、まだ伝統的な Python 定義を使用することになります。
-
もし、追加のライブラリ (例えば
opencv
のような) 追加のライブラリを使用する場合、そのディレクトリを-L
でディレクトリを指定し、ライブラリ名を-l
を GCC Flags で指定します。これについては、GCC flagsを参照してください。
関連
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] AndroidでPythonを実行する方法はありますか?
-
[解決済み] Pythonの静的メソッド?
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み] Pythonで複数行のコメントを作成する方法はありますか?
-
[解決済み] Python 3で文字列をバイトに変換する最良の方法?
-
[解決済み] リストの要素を値で削除する簡単な方法はありますか?
-
[解決済み] スレッドを強制終了させる方法はありますか?
-
[解決済み] Python int to binary string?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonが解釈される場合、.pycファイルとは何ですか?
-
[解決済み] Virtualenvに別のバージョンのPythonをインストールすることは可能ですか?
-
[解決済み] バブルソートの宿題
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] Python 3でバイナリデータを標準出力に書き込むには?
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] 古いバージョンのPythonにおける辞書のキーの並び順
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] 新しいpip backtrackingの実行時問題の解決