Cythonを使用して既存のCライブラリを呼び出し、Python用の最初のC拡張機能を構築することができました。
データ型と関数を論理コンポーネントに宣言して定義し(Cライブラリの論理構造に従って)、それらを1つのpyxファイルに結合しました-ファイルを個別に追加しようとしたときにエラーが発生した後(IIRC何かエラーが発生しました)すでに定義されているinitの線に沿って-そしてGoogleで問題を調査した後、すべてのpyxファイルと1つのpyxファイルを組み合わせる必要があることがわかりました)-このリンクを参照してください。
これは私のfoo.pyxファイルの内容のコピーです:
#include "myarray.pyx"
#include "myset.pyx"
#include "mycalc.pyx"
これは私のセットアップファイルのコピーです:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(
cmdclass = {'build_ext': build_ext},
ext_modules = [Extension("foo", ["foo.pyx"],
libraries=["foo_core"])
]
)
拡張機能はfoo.soに正常に組み込まれるので、PythonCLIで「importfoo」と入力できます。それも機能します。ただし、myarray.pxd、myarray.pyxなどで宣言/定義したクラスのいずれかにアクセスしようとすると、次のエラーメッセージが表示されます。
AttributeError: 'module' object has no attribute 'myArray'
次に、dir()を試して、fooモジュールが何をエクスポートしているかを確認しました。驚いたことに、これはそれがリストしたものです:
>>> dir(foo)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__test__']
Cythonが宣言および定義した構造体、クラス、関数のエクスポートに失敗するのはなぜですか?私が言ったように、それは正常にコンパイルされ、共有lib(python拡張)が生成されるので、私のpxdファイルとpyxファイルに何も問題はないと思います。
UbuntuでCython0.15.1とPython2.6.5を使用しています