修改传递给C函数的Python变量
我正在导入一个用C编写的共享对象库,并调用一些使用Python.h库实现的包装函数 我有一个具有以下原型的函数:修改传递给C函数的Python变量,python,c,shared-objects,Python,C,Shared Objects,我正在导入一个用C编写的共享对象库,并调用一些使用Python.h库实现的包装函数 我有一个具有以下原型的函数: PyObject *Cal_readFile( PyObject *self, PyObject *args ); 我解析出以下元组: PyArg_ParseTuple(args, "sO", &filename, &result) 从python中,调用如下所示: result = [] status = Cal.readFile(filename, resul
PyObject *Cal_readFile( PyObject *self, PyObject *args );
我解析出以下元组:
PyArg_ParseTuple(args, "sO", &filename, &result)
从python中,调用如下所示:
result = []
status = Cal.readFile(filename, result)
print(result)
它被称为fine,函数肯定会运行。我的目标是在调用的C函数中修改result
变量。这正是我所做的。我在C函数中修改结果变量,并使用result=Py_BuildValue(“[lO]”,长)comp,compList)
将新数据放入其中
然而,当我在Python中打印时,我仍然有一个相同的空列表
是否需要执行一些额外的步骤来从C函数修改这个python变量?我不能在返回中使用它,因为您已经看到我正在从那里收集返回状态(此返回有效)
编辑:readCal中可能有用的一些代码:
PyObject *result = NULL;
PyArg_ParseTuple(args, "sO", &filename, &result);
//Some creating of data is done, and then I am trying to set the list to that data:
result = Py_BuildValue("[lO]", (long)comp, compList);
当您这样做时:
PyArg_ParseTuple(args, "sO", &filename, &result)
result = Py_BuildValue("[lO]", (long)comp, compList);
您正在将python处理的实例引用分配到result
指针中
然后,当您这样做时:
PyArg_ParseTuple(args, "sO", &filename, &result)
result = Py_BuildValue("[lO]", (long)comp, compList);
您正在将结果指针引用的值替换为新值。这意味着在python代码中,result
变量仍然指向前一个实例
如果您想要修改指向的列表实例,那么您应该使用C中的list方法来改变实例本身,而不是创建新实例
基本上,您在C代码中执行的操作与以下python代码相同:
>>> def foo(result):
... result = [4,5,6]
...
>>> result = [1,2,3]
>>> foo(result)
>>> print(result)
[1,2,3]
在python中,您需要做的是:
>>> def foo(result):
... while len(result):
... result.pop() # or any operation that mutates the result instance
... result += [4,5,6]
...
>>> result = [1,2,3]
>>> foo(result)
>>> print(result)
[4,5,6]
现在我让您使用C API来完成它;-)
HTH您不能完全替换结果
,但您可以向其附加值,或删除现有值等等。像这样的东西可以满足你的需要:
if (!PyArg_ParseTuple(args, "sO", &filename, &result)) {
return NULL;
}
PyObject *l = PyLong_FromLong((long)comp);
if (!l) {
return NULL;
}
int success = PyList_Append(result, l);
Py_DECREF(l);
if (! success) {
return NULL;
}
success = PyList_Append(result, complist);
if (! success) {
return NULL;
}
您的意思是要在列表中附加这些值吗?在Python中不能替换这样的变量,在C中也不可能。请为Cal_readFile
@AnttiHaapala提供更多代码是的,我想追加可能是正确的方法。这个文件相当大,这就是我没有粘贴它的原因。我将编辑一些可能相关的内容。@AnttiHaapala我添加了一些代码,可能对您有所帮助。您可以看到,我正在用一个新列表替换结果值,我想这可能是问题所在,因为我正在用元组替换而不是追加,或者可能使用PyList_SetSlice
,就像现在如果第二次追加失败,仍然会有1项追加到listGood建议,但如果它真的没有得到一个,那么很可能两者都失败了。第一个long实际上只是存储C指针,第二个部分是来自该指针地址的一些操作数据。