Почему PyObject_IsInstance всегда возвращает 0 в моем примере кода

Я пишу образец для изучения python, но когда вызывается PyObject_IsInstance, эта функция всегда возвращает 0. Вот мой код c ReadBuf.c

#include "Python.h" static PyObject* Test_IsInstance(PyObject* self, PyObject* args){ PyObject* pyTest = NULL; PyObject* pName = NULL; PyObject* moduleDict = NULL; PyObject* className = NULL; PyObject* pModule = NULL; pName = PyString_FromString("client"); pModule = PyImport_Import(pName); if (!pModule){ printf("can not find client.py\n"); Py_RETURN_NONE; } moduleDict = PyModule_GetDict(pModule); if (!moduleDict){ printf("can not get Dict\n"); Py_RETURN_NONE; } className = PyDict_GetItemString(moduleDict, "Test"); if (!className){ printf("can not get className\n"); Py_RETURN_NONE; } /* PyObject* pInsTest = PyInstance_New(className, NULL, NULL); PyObject_CallMethod(pInsTest, "py_print", "()"); */ int ok = PyArg_ParseTuple(args, "O", &pyTest); if (!ok){ printf("parse tuple error!\n"); Py_RETURN_NONE; } if (!pyTest){ printf("can not get the instance from python\n"); Py_RETURN_NONE; } /* PyObject_CallMethod(pyTest, "py_print", "()"); */ if (!PyObject_IsInstance(pyTest, className)){ printf("Not an instance for Test\n"); Py_RETURN_NONE; } Py_RETURN_NONE; } static PyMethodDef readbuffer[] = { {"testIns", Test_IsInstance, METH_VARARGS, "test for instance!"}, {NULL, NULL} }; void initReadBuf(){ PyObject* m; m = Py_InitModule("ReadBuf", readbuffer); } 

И ниже мой код python client.py

 #!/usr/bin/env python import sys import ReadBuf as rb class Test: def __init__(self): print "Test class" def py_print(self): print "Test py_print" class pyTest(Test): def __init__(self): Test.__init__(self) print "pyTest class" def py_print(self): print "pyTest py_print" b = pyTest() rb.testIns(b) 

Я передаю b, который является экземпляром pyTest для C, и он разбирается PyArg_ParseTuple с pyTest. При запуске PyObject_IsInstance результат всегда равен нулю, что означает, что pyTest не является экземпляром Test. Мой вопрос: когда параметр pass от python до C, является ли тип изменен? Как мне сделать, если я хочу сравнить это, если pyTest является экземпляром Test?

Спасибо, Ватель

client модуль не полностью загружен, когда расширение пытается загрузить client модуль; Выполнение client происходит дважды (внимательно следите за результатами).

Поэтому Test в client.py и Test в модуле расширения ссылается на разные объекты.

Вы можете обойти это, извлекая классы в отдельный модуль. (Скажите common.py ) И импортируйте common как в client.py и в модуль расширения.

См. Демонстрацию .