私は泣き叫んで私の髪を裂いてしまったので、ついにこれを働かせました。まず、私はC++をCに書き直さなければなりませんでした。実際には、すべてのstd::string
変数をchar*
に変換し、いくつかの長さを記録していました。
完了したら私の.hと.cファイルがありました。私は、Pythonで利用可能なCコードから単一の関数を作成したかったのです。 CythonはあなたのC言語のファイルをあなたのためのエクステンションにコンパイルし、すべてのライブラリを一度にリンクすることができます。PY、それはこのように見てしまった:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules=[
Extension("myext",
["myext.pyx", "../stuff.c"],
libraries=["ssl", "crypto"]
)
]
setup(
name = "myext",
cmdclass = {"build_ext": build_ext},
ext_modules = ext_modules
)
あなたが見ることができるように、拡張への2番目の引数は単にコンパイルする必要があるすべてのファイルを一覧表示し、Cythonは、そのファイルの拡張子に応じて、それらをコンパイルする方法をうまくいきます私の知る限り。ライブラリ配列は、Cythonコンパイラに何をリンクする必要があるのかを伝えます(この場合、私は既存のPythonライブラリをそのまま模倣することができなかった暗号のものをラッピングしています)。
実際に.pyxファイルでC関数を使用できるようにするには、.pxdに小さなラッパーを記述します。私myext.pxdは、以下のように見えた:あなたは、それが他のPythonの関数であるかのように使用するために利用可能である、この機能をインポートするcimport宣言を使用し.pyxで
cdef extern from "../stuff.h":
char* myfunc(char* arg1, char* arg2, char* arg3)
:
cimport myext
def my_python_func(arg1, arg2, arg3):
result = myext.myfunc(arg1, arg2, arg3)
return result
これを(少なくともMac上で)ビルドすると、Pythonでインポートして.pyxから関数を実行できる.soが得られます。このすべての作業を得るには、より良い、より正しい方法があるかもしれませんが、それは経験から来ており、これは私がうまくいった最初の遭遇でした。私は間違っている可能性のあるポインタに非常に興味があります。
更新:Cythonのさらなる使用後
、私はあなたが何をやっている知っていれば、あまりにもC++と統合するために、超簡単でした。 C++のstring
を利用可能にすることは、pyx/pydのfrom libcpp.string cimport string
と同じくらい簡単です。 C++クラスを宣言することも同様に容易である:
cdef extern from "MyCPPClass.h":
cdef cppclass MyCPPClass:
int foo;
string bar;
確かに、あなたは基本的にPython的形式でクラスの.hの定義を再宣言する必要があり、それはあなたの既に書かれてC++の機能へのアクセスを得るために支払うために小さな価格です。
質問に答えられた場合は、この質問に回答としてマークしてください。それ以外の場合はもう一度質問をしてください。 –
@NiklasRあなたの答えは私の混乱の領域の一部をカバーしましたが、私をすべて邪魔しませんでした。私はあなたに投票を与えましたが、私は余裕があるときに私が取り組んだ他のビットの完全な答えを書くことを意図しました。 – Endophage