2

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を使用しています

4

1 に答える 1

3

#コメント行の開始を宣言するので、あなたfoo.pyxは事実上空です。

include鈍器です。*.pxd代わりにcimportを使用してください。

于 2011-11-07T06:50:31.267 に答える