我写了一个示例来学习python,但是当调用PyObject_IsInstance时,这个函数总是返回0。 这是我的代码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)
我将作为pyTest实例的b传递给C,并将PyArg_ParseTuple解析为pyTest。运行PyObject_IsInstance时,结果始终为零,这意味着pyTest不是Test的实例。 我的问题: 当从python传递参数到C时,类型是否改变了?如果我想比较一下如果pyTest是Test的一个实例,我该怎么办?
谢谢, 瓦岱勒
答案 0 :(得分:1)
当扩展程序尝试加载client
模块时,client
模块未完全加载。执行client
两次(仔细观察输出)。
因此Test
中的client.py
和扩展模块中的Test
引用了不同的对象。
您可以通过在分离的模块中提取类来解决此问题。 (说common.py
)并在common
和扩展模块中导入client.py
。
请参阅a demo。