85

Cythonを使用して.soファイルにコンパイルされたPythonモジュールをロードできるPython2.6プログラムがあります。Cythonを使用して.pyモジュールを.soファイルにコンパイルしましたが、すべて正常に動作します。

これは私がCythonで使用するsetup.pyファイルです:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [
    Extension("ldap", ["ldap.pyx"]),
    Extension("checker", ["checker.pyx"]),
    Extension("finder", ["finder.pyx"]),
    Extension("utils", ["utils.pyx"]),
]

setup(
  name = 'bchecker',
  cmdclass = {'build_ext': build_ext},
  ext_modules = ext_modules
)

したがって、Cythonを使用してPythonモジュールをコンパイルできることはわかっています(CythonはPythonファイルから「C」ファイルを作成してからコンパイルします)が、メインのPythonプログラムをLinuxプラットフォームで実行できるものにコンパイルできますか?もしそうなら、Cythonコマンドラインの例をいただければ幸いです。ありがとう。

4

5 に答える 5

163

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 などのバージョン。

于 2014-02-26T11:50:15.327 に答える
18

Can Cython compile to an EXE? への回答を見てください。ここでの他のすべての回答とは対照的に、はい、実行可能ファイルにコンパイルすることは可能です。

Embedding Cythonのリンクは開始するのに適した場所のようですが、Cython の主な目的ではないので、それがどれほど簡単かはわかりません。

于 2011-02-24T18:00:24.217 に答える
0

この投稿を見てください:

cython <cython_file> --embed

そしてちょうど

gcc <C_file_from_cython> -I<include_directory> -L<directory_containing_libpython> -l<name_of_libpython_without_lib_on_the_front> -o <output_file_name>

ここに例があります:

cython3 main.py --embed
gcc main.c -I /usr/include/python3.8/ -L /lib/x86_64-linux-gnu/ -l python3.8 -o main
于 2021-10-06T13:47:34.017 に答える
-25

できません。Cython は Python をコンパイルしたり、実行可能ファイルに変換したりするようには作られていません。

.exe ファイルを生成するには、py2exeを使用します。

Mac または Linux 用のパッケージを作成するには、通常のパッケージング システム プロセスを使用します。これは、Unix env のスクリプト言語プログラムに固有のものは何もないためです。

于 2011-02-24T14:06:46.037 に答える