2015-05-19 2 views
0

Я хочу передать двумерный массив питона из C.Как пройти Двумерный массив из C в Python

Как я могу использовать Py_BuildValue() и PyEval_CallObject()?

Например, я могу использовать следующий код, чтобы передать строку из C в Python:

pModule = PyImport_ImportModule("python_code"); 
pFunc = PyObject_GetAttrString(pModule, "main"); 
pParam = Py_BuildValue("(s)", "HEHEHE"); 
pResult = PyEval_CallObject(pFunc,pParam); 

Теперь я хочу передать двумерный массив и строку в Python

+0

Нужно ли вам возвращать список или изменять аргумент списка? Если вы не знаете, то возвращение легче. – cdarke

+0

Возможно, вы также захотите рассмотреть ctypes в стандартной библиотеке. – cdarke

+1

можете ли вы показать нам свой код и образцы данных, которые вы хотите передать на python? –

ответ

1

Так в основном , вы хотите построить кортеж, а не разобрать один.

Это простой пример того, как можно преобразовать arr в кортеж кортежей. Здесь вы также должны добавить некоторую проверку ошибок в определенный момент времени.

Py_ssize_t len = arr.size(); 
PyObject *result = PyTuple_New(len); 
for (Py_ssize_t i = 0; i < len; i++) { 
    Py_ssize_t len = arr[i].size(); 
    PyObject *item = PyTuple_New(len); 
    for (Py_ssize_t j = 0; i < len; j++) 
     PyTuple_SET_ITEM(item, j, PyInt_FromLong(arr[i][j])); 
    PyTuple_SET_ITEM(result, i, item); 
} 

Тогда вы можете построить свои аргументы, как и со строкой. Вместо s для строки, которую вы будете использовать для OPyObject * (или N, если вы не хотите, чтобы увеличить количество ссылок):

pParam = Py_BuildValue("(O)", result); 

Может быть boost::python может обеспечить более простой метод, но я реально не знаю библиотеки.

+0

Thankyou tynn, то как отправить значение скрипту python после создания кортежа. Например, я использовал этот код для отправки строки: pParam = Py_BuildValue ("(s)", "HEHEHE"); pResult = PyEval_CallObject (pFunc, pParam); – vinllen

+0

Я обновил ответ на ваши вопросы. – tynn

+0

Thankyou tynn, это помогает мне – vinllen

0

второй цикл нуждается в изменении Subtile от:

for (Py_ssize_t j = 0; i < len; j++)

в

for (Py_ssize_t j = 0; j < len; j++)

с условием заявления правом работы.

Смежные вопросы