61

Python が C コードで Python インタープリターを呼び出せるように API を提供していることは知っていますが、私が望むのはその逆です。

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

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

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

4

2 に答える 2

107

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

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

Python コード

import example
result = example.do_something()

Cコード

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

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

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

Cコードを実行可能ファイルに書き込むと、つまりコマンドになります。Pythonで直接呼び出すことはできますか?

*.exeを作成すると、逆のことを行います ( C から Python を呼び出します)。選択する方法 (exe と共有ライブラリ) は、「Python を使用したC プログラム」または「C を使用した Python プログラム」のどちらが必要かによって異なります。

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

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

于 2013-09-12T12:22:45.023 に答える
13

Python を拡張する必要はありませんが(これは些細なことではありません)、ctypesなどの外部関数インターフェイスを使用できます。

于 2013-09-12T11:17:21.160 に答える