从python调用函数,在c中返回元组

时间:2016-10-10 21:25:39

标签: python c

我正在尝试从我的C脚本调用python函数。我成功从python函数返回一个double变量并将其打印在我的C脚本中。我现在的问题是我需要从python返回多个变量(元组)。我怎么能成功呢?我带有单个变量返回的代码如下:

#include <python2.7/Python.h>

int main(){
PyObject *pName, *pModule, *pDict, *pFunc;
PyObject *pArgs, *pValue;   
int i;
double read;

Py_Initialize();
PyObject* sysPath = PySys_GetObject((char*)"path");
PyList_Append(sysPath, PyString_FromString("."));
pName = PyString_FromString("eadata"); //Primer posible error
pModule = PyImport_Import(pName);
Py_DECREF(pName);       

if(pModule != NULL){
    pFunc = PyObject_GetAttrString(pModule,"lectura");
    if(pFunc && PyCallable_Check(pFunc)){
        pValue = PyObject_CallObject(pFunc,NULL);
        if(pValue != NULL){
            printf("Result of call: %lf \n", PyFloat_AsDouble(pValue));
            Py_DECREF(pValue);
        }
        else{
            Py_DECREF(pFunc);
            Py_DECREF(pModule);
            PyErr_Print();
            fprintf(stderr,"Call failed\n");
            return 1;
        }
    }       
}
else{
    PyErr_Print();
    fprintf(stderr, "Error al cargar eadata.py \n");
    }
}

我的python脚本是:

def lectura():

    device = '/dev/ttyUSB0'
    baudrate = 115200   
    mt=mtdevice1.MTDevice(device, baudrate)

    ax=mtdevice1.acx 
    ay=mtdevice1.acy
    az=mtdevice1.acz

    wx=mtdevice1.wx             
    wy=mtdevice1.wy
    wz=mtdevice1.wz

    mx=mtdevice1.mx
    my=mtdevice1.my
    mz=mtdevice1.mz

    roll = mtdevice1.roll
    pitch = mtdevice1.pitch
    yaw = mtdevice1.yaw
    pc = mtdevice1.pc

    return ax

这有效,但我想同时返回其他变量,例如ay,az等。我第一次使用嵌入式python,我真的不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

With a small caveat,您可以使用PyArg_ParseTuple来分离您调用的函数返回的元组。

只要返回的元组与您提供给PyArg_ParseTuple的格式字符串匹配,这将正常工作。如果存在不匹配,PyArg_ParseTuple产生的错误将会产生误导,因为它假定元组是参数元组。

一种不太方便但更通用的方法是使用tuple API