Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
修改传递给C函数的Python变量_Python_C_Shared Objects - Fatal编程技术网

修改传递给C函数的Python变量

修改传递给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

我正在导入一个用C编写的共享对象库,并调用一些使用Python.h库实现的包装函数

我有一个具有以下原型的函数:

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指针,第二个部分是来自该指针地址的一些操作数据。