gpt4 book ai didi

python - 为什么 PyObject_IsInstance 在我的示例代码中总是返回 0

转载 作者:太空宇宙 更新时间:2023-11-03 23:50:11 28 4
gpt4 key购买 nike

我写了一个学习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)

我将 pyTest 的一个实例 b 传递给 C,它由 PyArg_ParseTuple 解析到 pyTest。运行 PyObject_IsInstance 时,结果始终为零,这意味着 pyTest 不是 Test 的实例。我的问题: 当从python传递参数到C时,类型是否改变了?如果我想比较pyTest是不是Test的一个实例怎么办?

谢谢,瓦泰尔

最佳答案

当扩展尝试加载 client 模块时,client 模块未完全加载。 client 的执行发生了两次(仔细观察输出)。

所以 client.py 中的 Test 和扩展模块中的 Test 引用了不同的对象。

您可以通过在单独的模块中提取类来解决此问题。 (比如 common.py)并在 client.py 和扩展模块中导入 common

参见 a demo .

关于python - 为什么 PyObject_IsInstance 在我的示例代码中总是返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21874018/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com