Исключение TypeError: «список аргументов должен быть кортежем» - PullRequest
1 голос
/ 28 февраля 2020

Я пытаюсь вызвать простую python функцию из cpp.

Ниже приведен код 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

1 Ответ

0 голосов
/ 02 марта 2020

Из документации:

PyObject * PyObject_CallObject (PyObject * callable, PyObject * args) Возвращаемое значение: Новая ссылка. Вызвать вызываемый объект Python callable с аргументами, заданными аргументами кортежа. Если аргументы не нужны, аргументы могут быть NULL.

Возвращать результат вызова при успешном выполнении или вызывать исключение и возвращать NULL при ошибке.

Это эквивалентно выражения Python: callable (* args).

Функция PyObject_CallObject (...) требует кортеж в качестве аргумента.

Также извлекайте this и этот пост для уточнения.

...