【问题标题】:Exception TypeError: 'argument list must be a tuple'异常类型错误:'参数列表必须是元组'
【发布时间】:2020-02-28 14:00:51
【问题描述】:

我正在尝试从 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

【问题讨论】:

  • 谁能给个提示?

标签: python c++ linker typeerror embedding


【解决方案1】:

来自文档:

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

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

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

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

还可以查看 thisthis post 以获得更多说明。

【讨论】:

    猜你喜欢
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2019-08-16
    • 2023-01-10
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多