Adam Matan などの主張とは反対に、実際には Cython を使用して純粋な Python (.py) ファイルから単一の実行可能なバイナリ ファイルを作成できます。
はい、Cython は、CPython python ランタイム用の C/C++ 拡張モジュールの記述を簡素化する方法として、記載されているとおりに使用することを目的としています。
ただし、nudzo がこのコメント--embed
で言及しているように、コマンド ライン プロンプトでスイッチを使用できます。
これは非常に単純な例です。python3 と cython3 を使用して、Debian Sid ワークステーションからこれを実行しています。
事前にpython-devまたはpython3-devパッケージがインストールされていることを確認してください。
1) hello.pyという非常に単純な Python プログラムを作成します。
$ cat hello.py
print("ハローワールド!")
2) Cython を使用して Python プログラムを C にコンパイルします。
cython3 --embed -o hello.c hello.py
3) GCC を使用して、hello.c をhello ...という実行可能ファイルにコンパイルします。
gcc -Os -I /usr/include/python3.3m -o hello hello.c -lpython3.3m -lpthread -lm -lutil -ldl
4) hello ...というファイルが作成されます。
$ファイルこんにちは
hello: ELF 64 ビット LSB 実行可能ファイル、x86-64、バージョン 1 (SYSV)、動的にリンク (共有ライブラリを使用)、GNU/Linux 2.6.32 用、BuildID[sha1]=006f45195a26f1949c6ed051df9cbd4433e1ac23、削除されていません
$ ldd hello
linux-vdso.so.1 (0x00007fff273fe000)
libpython3.3m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.3m.so.1.0 (0x00007fc61dc2c000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc61da0f000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc61d70b000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fc61d508000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc61d304000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc61cf5a000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fc61cd52000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007fc61cb28000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fc61c90f000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc61e280000)
この場合、実行可能ファイルは Debian システム上の Python 3.3 に動的にリンクされています。
5)実行こんにちは...
$ ./こんにちは
「こんにちは世界」
ご覧のとおり、この方法を使用すると、基本的に Cython を使用して純粋な Python アプリケーションを実行可能なコンパイル済みオブジェクト コードに変換できます。
私はこの方法を非常に複雑なアプリケーションに使用しています。たとえば、本格的な Python/PySide/Qt アプリケーションなどです。
Python のバージョンが異なる場合は、それに合わせて gcc-I
と-l
スイッチを調整します。
次に、Python/PySide/Qt ファイルをパッケージ化することなく、実行可能ファイルをディストリビューション (.deb など) ファイルとしてパッケージ化できます。これは、ディストリビューションを同じものに更新した後でもアプリケーションを実行できるという利点があります。そのディストリビューションの Python などのバージョン。