web-dev-qa-db-ja.com

メインをコンパイルPython Cythonを使用してプログラム

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コマンドラインの例を使用してください。ありがとうございます。

71
mozza

Adam Matanや他の人が主張していることとは反対に、あなたはcan実際にCythonを使用して、純粋なPython(.py)ファイル。

はい、CythonはCPython pythonランタイム用のC/C++拡張モジュールの記述を簡素化する方法として-述べられているように使用することを目的としています。

しかし、nudzoがこの comment で言及しているように、--embedコマンドラインプロンプトで切り替えます。

これは非常に単純な例です。 python3とcython3を使用して、Debian Sidワークステーションからこれを実行しています。

事前にpython-devまたはpython3-devパッケージがインストールされていることを確認してください。

1)非常に簡単なPythonというプログラムを作成hello.py

$ cat hello.py

print( "Hello World!")

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というファイルが作成されます...

$ file 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)runhello...

$ ./hello

"こんにちは世界"

ご覧のとおり、このメソッドを使用すると、基本的にCythonを使用して、純粋なPythonアプリケーションを実行可能なコンパイル済みオブジェクトコードに変換できます。

非常に複雑なアプリケーション(たとえば、本格的なPython/PySide/Qtアプリケーション)にこのメソッドを使用しています。

Pythonの異なるバージョンでは、gcc-Iおよび-lは、必要に応じて切り替わります。

その後、Python/PySide/Qtファイルをパッケージ化することなく、実行可能ファイルをディストリビューション(.debなど)ファイルとしてパッケージ化できます。同じものへのディストリビューション更新後でもアプリケーションを実行できるという利点があります。そのディストリビューションのPythonなどのバージョン。

140
Broken Man

CythonはEXEにコンパイルできますか? への回答をご覧ください。

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

17
Scott Griffiths

これが役立つかどうかはわかりませんが、Nudzoは正しいです。あなたはcython --embed -o main.o main.pyでそれを得ることができ、それからcl/EHscで結果をコンパイルしようとします

3
Jake Cook