C++调用时python时,如何传入数组做为参数

defprintList(list):print('Star');printlen(list)forvarinlist:printvar以上是python源码,因为只是做... def printList(list ):
print('Star');
print len(list)
for var in list:
print var
以上是python源码,因为只是做为测试较为简单
pFunc = PyDict_GetItemString(pDict, "printList");
if (!pFunc)
exit(0);
PyObject* list = PyList_New(3);
for (size_t i = 0; i < 3; i++)
PyList_Append(list, Py_BuildValue("i", i));
PyEval_CallObject(pFunc, list);
这是C++源码,python中的方法要求传入一个列表,我按我C++代码中的做法,将一个生成好的pyobject*的列表传入时,代码无法正常执行。这边的问题出在哪?我该怎么做?谢谢。
展开
 我来答
帐号已注销
推荐于2018-03-04 · TA获得超过1538个赞
知道小有建树答主
回答量:601
采纳率:0%
帮助的人:465万
展开全部

题主,你基本操作没什么问题,有几个小地方要修改一下,修改如下:


你的源码:

PyObject* list = PyList_New(3);    
for (size_t i = 0; i < 3; i++)
PyList_Append(list, Py_BuildValue("i", i));

PyEval_CallObject(pFunc, list);

--------------------------------------------------------------------------------------

修改后,应该是这样
PyObject* pArgs = NULL;

PyObject* list = PyList_New(0);    //3改成0
pArgs = PyTuple_New(1);                 //定义1个参数

for (size_t i = 0; i < 3; i++)
PyList_Append(list, Py_BuildValue("i", i)); //这样才能用Append,
PyTuple_SetItem(pArgs, 0, list);    //将列表赋给参数
PyEval_CallObject(pFunc, list);    //传入参数,调用函数

注意事项:PyList_New(0) 初始化0的时候,应该用Append初始化
PyList_New(3) 初始化3个时候,应该用SetItem初始化
如果用Append的话,会出现[NULL, NULL, NULL]的情况

我在给一个完整的:

Python :(hello.py)      

def TestList(nlist):
        print(nlist)
        return


一般参数都是已元组形式传入的

 	Py_Initialize();
 
  PyRun_SimpleString("import sys");   
PyRun_SimpleString("sys.path.append('./')");  

PyObject* pModule =NULL;
PyObject* pList = NULL;
PyObject* pFunc = NULL;
PyObject* pArgs = NULL;

  pModule = PyImport_ImportModule("hello");
  pFunc = PyObject_GetAttrString(pModule, "TestList");
  pArgs = PyTuple_New(1);
pList = PyList_New(0);
for (int i = 0; i < 3; i++)
{
    PyList_Append(pList, Py_BuildValue("i", i));
}
PyTuple_SetItem(pArgs, 0, pList);
pRet = PyEval_CallObject(pFunc, pArgs);

Py_Finalize();

最后输出的:[0, 1, 2]

左灬王
2014-12-06 · 超过43用户采纳过TA的回答
知道答主
回答量:105
采纳率:0%
帮助的人:68.9万
展开全部
在list后加[] 传递进去就好了 要是要改变原先的数组就要传递指针
更多追问追答
追问
这里有点不太明白的是,我的源码中多次出现过list,你的答杂所指的是python中的list还是c++中的list?因为我按你的说法都试过了,但都有语法错误。其实是,传递指针的话不应该是在这里改写成PyEval_CallObject(pFunc, &list);这样吗?

如果不麻烦的话,能否写一下试例,谢谢
追答
是     c++是&引用     你太天才了   C/C++编译器亦支持*指针(形参)传递
总之就是说 你扔给黑盒子一样东西 他不会改变那样东西 只会在另一个地址上创建并运算 当然 在黑盒子里边输出就不必考虑这些了
若是要在外部看到运算结果 可以设黑盒子返回 也可以告诉黑盒子一个地址 让他直接在地址里面操作
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
柳鲲鹏
2018-11-03 · TA获得超过513个赞
知道答主
回答量:190
采纳率:55%
帮助的人:7.3万
展开全部
关键在于 import_array(),否则必然崩溃。

#include <Python.h>
#include <numpy/arrayobject.h>

//必须这样写!
void init_numpy()
{
import_array();
}

int fext_python_init(const char* pPath)
{
PyObject *pArgs = NULL;

Py_Initialize();
init_numpy();

PyObject* pArgs = PyTuple_New(1);

//将c的img数组数据转换成pyobject类型的数组数据
npy_intp dims[1] = {pImage->clip.width * pImage->clip.height * 4};

//给定维度信息
PyObject *pPyArray = PyArray_SimpleNewFromData(1, dims, NPY_CHAR, pImage->buffer.data);
PyTuple_SetItem(pArgs, 1, pPyArray);

……

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式