0

私は、いくつかの関数とカスタム型を定義する最初の Python C 拡張機能の作成に取り組んでいます。奇妙なことに、カスタム タイプは機能していますが、通常の機能は機能していません。最上位の MyModule.c ファイルは次のようになります。

static PyMethodDef MyModule_methods[] = {
    {"doStuff", MyModule_doStuff, METH_VARARGS, ""},
    {NULL, NULL, 0, NULL} /* Sentinel */
};

static struct PyModuleDef MyModule_module = {
    PyModuleDef_HEAD_INIT,
    "mymodule",
    "Documentation",
    -1,
    MyModule_methods
};

PyMODINIT_FUNC PyInit_audioDevice(void) {
    PyObject *object = PyModule_Create(&MyModule_module);
    if(object == NULL) {
        return NULL;
    }

    if(PyType_Ready(&MyCustomType_type) < 0) {
        return NULL;
    }

    Py_INCREF(&MyCustomType_type);
    PyModule_AddObject(object, "MyCustomType", (PyObject*)&MyCustomType_type);

    return object;
}

この setup.py ファイルを使用して拡張機能を構築しています。

from distutils.core import setup, Extension
setup(name = "mymodule",
      version = "1.0",
      ext_modules = [Extension("mymodule", ["MyModule.c", "MyCustomType.c", "DoStuff.c"])])

「DoStuff」ファイルは、その機能を次のように定義します。

static PyObject*
AudioOutputOSX_doStuff(PyObject *self, PyObject *args) {
  printf("Hello from doStuff\n");
  return Py_None;
}

面白いことに、MyCustomType 型は次のようにインスタンス化できるため、正常に動作します。

from mymodule.MyCustomType import MyCustomType
foo = MyCustomType()

そして、カスタム型の new メソッドと init メソッドからの printf() ステートメントが出力されているのがわかります。ただし、このコードは失敗します。

import mymodule
mymodule.doStuff()

次のエラーが表示されます: Traceback (most recent call last): File "MyModuleTest.py", line 9, in mymodule.doStuff(buffer) AttributeError: 'module' object has no attribute 'doStuff'

ここで何が起こっているのですか?モジュールのメソッド宣言に何らかのエラーがありますか?

4

2 に答える 2

2

このコードが機能するという事実:

from mymodule.MyCustomType import MyCustomType

絶対に驚くべきことであり、それmymoduleが実際にはpackageでありMyCustomType、その package 内のモジュール (同じ名前の型またはクラスを含む) であることを示しています。

したがって、関数を呼び出すには、明らかに次のことを行う必要があります。

from mymodule import MyCustomType as therealmodule
therealmodule.doStuff()

など-あなたが私たちに提供した情報、特にあなたが言うコードから引用したコードの最初の行が実際に正確であると仮定します。

于 2010-09-23T02:18:21.143 に答える
0

import mymoduleの後にを実行すると何が表示されprint(dir(mymodule))ますか?

あなたのモジュールは 3 つのファイルに分割するのに十分な大きさですか? 分割は、リンクで非常に複雑になります...おそらく名前マングリングですか?

AudioOutputOSX_doStuffMyModule_doStuff... 本当の問題か、それとも単なる質問編集の問題か?

どのプラットフォーム、どのコンパイラ?

于 2010-09-22T23:30:08.173 に答える