web-dev-qa-db-ja.com

PythonでCコードを使用できますか?

PythonがAPIを提供するので、CコードでPythonインタープリターを呼び出すことができますが、必要なのはその逆です。

私のプログラムはC APIを使用する必要があるため、コードはCで作成する必要があります。しかし、プログラムをPythonでパッケージ化することも必要です。つまり、これらのC関数または実行可能ファイルをPythonで呼び出したいということです。それは可能ですか?

Cコードをライブラリにしたい、つまりPythonで#include*.oのリンケージで使用することを意味する場合、どうすればいいですか?それは可能ですか? Cコードを実行可能ファイルに書き込むと、つまりコマンドになりますが、Pythonで直接呼び出すことができますか?

また、Pythonコードをコンパイルできると聞きましたが、それはソースファイルなしでコードを実行できるということですか?出力ファイルはバイナリファイルですか?パフォーマンスが向上しますか?

40
dspjm

これらのC関数または実行可能ファイルをPythonで呼び出したいです。それは可能ですか。

はい、モジュールとしてインポートできるCコードを記述できます。Pythonモジュールとして。Pythonこれらを呼び出す拡張モジュール 。Pythonから直接呼び出すことができます。 documentation の例:

Pythonコード

import example
result = example.do_something()

Cコード

static PyObject * example(PyObject *self)
{
    // do something
    return Py_BuildValue("i", result);
}

Cコードをライブラリにしたい場合、つまり#includeを使用して、Pythonで* .oのリンケージを使用する場合は、その方法またはそれが可能です。

共有ライブラリ*。dllまたは*。soとしてビルドします。distutilsを使用してモジュールを配布することもできます。

Cコードを実行可能ファイルに書き込んだ場合、つまりコマンドになった場合、pythonで直接呼び出すことができますか?

*。exeを記述した場合、反対のことを行います( Python from C )。選択する方法(exeと共有ライブラリ)は、 "CプログラムとPython"または "PythonプログラムとC 「

また、pythonコードをコンパイルできるということは、ソースファイルなしでコードを実行できることを意味しますか?出力ファイルはバイナリファイルですか?パフォーマンスが向上しますか?

Pythonは*。pyファイルを読み取り、実行時に*。pycbytecodeファイルにコンパイルします。次に、バイトコードはPython仮想マシンで実行されます。つまり、 "ソースからバイトコードへの再コンパイルを回避できるため、同じファイルの2回目の実行が高速になります。」 (Python用語集)から*。pyファイルを編集していない場合、*。pyc*。pyファイルなしで*。pycファイルを配布できますが、暗号化されず、リバースエンジニアリングできます。

77
Jacqui Gurto

extendPython(これは些細なことではありませんが、btw)は必要ありませんが、ctypes

11
ffriend

はい、C/C++でPythonを拡張できます。

ドキュメントをご覧ください: Extending Python with C or C++

10
Daniel Hepper