首页 > 解决方案 > 异常类型错误:'参数列表必须是元组'

问题描述

我正在尝试从 cpp 调用一个简单的 python 函数。

下面是cpp代码:

#include <iostream>
#include <Python.h>
#include <numpy/arrayobject.h>
using namespace std;

void init_numpy()
{
    import_array();
}

int main()
{
char dir[500];
cout << "Enter directory: \n";
cin >> dir;

Py_Initialize();

const char *scriptDirectoryName = dir; 
PyObject *sysPath = PySys_GetObject("path");
PyObject *path = PyString_FromString(scriptDirectoryName);
int result = PyList_Insert(sysPath, 0, path);
PyObject *pModule = PyImport_ImportModule("mytest");

init_numpy();
double getItem[2] ;

getItem[0] = getItem[1] = 2;

npy_intp dims = 2 ;

PyObject* arrayToPass =  PyArray_SimpleNewFromData(1, &dims, NPY_DOUBLE , (void *)getItem);

PyObject* myFunction = PyObject_GetAttrString(pModule,(char*)"stuff");

//PyObject* args = PyTuple_Pack(1,PyFloat_FromDouble(getItem));
PyObject* myResult = PyObject_CallObject(myFunction, arrayToPass);
//double resultasd = PyFloat_AsDouble(myResult);
//cout << resultasd << endl;

    Py_Finalize();
    return 0;
}

这是我的python代码:mytest.py

def stuff(a):
   x = a[1]
   return x

这只是对我正在编写的更大补丁的测试,但方法是相同的。

我收到此错误:

Exception TypeError: 'argument list must be a tuple' in <module 'threading' from '/usr/lib/python2.7/threading.pyc'> ignored

我搜索了多个线程,但每个人都有一个独特的错字或错误。

有什么建议我做错了吗?

我正在编译为:

g++ -I /usr/include/python2.7/   che.cpp -lpython2.7 -o linkArr

标签: pythonc++linkertypeerrorembedding

解决方案


从文档:

PyObject* PyObject_CallObject(PyObject *callable, PyObject *args) 返回值:新引用。使用元组 args 给出的参数调用可调用的 Python 对象。如果不需要参数,则 args 可以为 NULL。

成功时返回调用结果,或引发异常并在失败时返回 NULL。

这相当于 Python 表达式:callable(*args)。

PyObject_CallObject(...) 函数需要元组作为参数。

另请查看此帖子以获得更多说明。


推荐阅读