私はPythonで書かれた関数を持っています。私はCython Documentation 'distutilsを使ってCythonモジュールを構築する'の手順に従っていました。しかし、Pythonで(インポートによって)C/C++に埋め込まれているモジュールを使用する方法は私には不明です。私はちょうどCythonを使用してPythonで生成されたモジュールをインポートするC/C++コードをコンパイルしたいと思っています(2ステッププロセスだと思います)。 pyxソースファイル。しかし、私の質問は、既存のC/C++ファイルにそのモジュールを統合する方法です。Cythonで生成されたモジュールをPythonからC/C++のメインファイルにインポートするには? (C/C++でのプログラミング)
答えて
Cython tutorialを見てから、これはCythonがどのように使用されるかです。コンパイル済みCモジュールを使用したPython。
- 個別のCythonモジュールはPythonで書かれています。 Cythonはこれを静的にコンパイルされたモジュールに変換します。
setup.py
ファイルを使用して、*.so
共有ライブラリとしてCythonモジュールをコンパイルします。この共有ライブラリは実際にはPythonモジュールです。通常のPythonスクリプトimport
一方、あなたがしたい場合はCでのPythonを拡張import helloworld
Cythonは通常に使用されているCythonモジュールから
python setup.py build_ext --inplace
embedあなたのCプログラムにはPythonコードもあります。 official docs on embedding Python into Cを見てみると、最初に読み上げるのに適しています。
ここでは、それを行う方法を説明しているgithub projectとそれを行う方法についてはa blogです。
# cymod.pyx
from datetime import datetime
cdef public void print_time():
print(datetime.now().ctime())
cymod.c
からcymod.pyx
をcythonizing、cymod.h
が同様に生成されます。
はちょうどあなたが例えばcdef public
として、C/C++で呼び出したいものを宣言します。
ライブラリを作成します(例:cymod.lib
)。
#include "Python.h"
#include "cymod.h"
int main(int argc, char **argv)
{
Py_Initialize();
PyInit_cymod(); // in cymod.h
print_time(); // call the function from cython
Py_Finalize();
return 0;
}
コンパイルして実行(MAIN.EXE)
注: MAIN.EXEが高いPythonの環境にバインドされている一つよいCコード(main.cの)において
cannot find pythonxx.dll
,Fatal Python error: Py_Initialize: unable to load the file system codec
などのエラーが発生します。このサイトには多くのソリューションがあります。
.libをどうやって作っていますか? –
@Steven GコマンドラインでVSコンパイラを使用します。たとえば 'call vcvarsall amd64' ' cl/c/nologo cymod.c/Ipython-header-path' 'lib cymod.obj' – oz1
私は上記のすべてのステップを実行しました。私の質問は、現在の既存のC/C++ファイルに、あなたのケースのhelloworldでそのモジュールを統合する方法です。私はその機能を使いたいです。しかし、コメントありがとう! –
私はPythonをCに埋め込む方法についていくつかのリンクを追加しました。私はCythonの通常の使用はCでPythonを拡張することだと思っていますが、 – MrJLP