2016-10-10 3 views
0

私のCスクリプトからPython関数を呼び出そうとしています。私はPython関数から二重変数を返し、私のCスクリプトでそれを表示することに成功しました。私が今問題としているのは、Pythonから複数の変数(タプル)を返す必要があるということです。どうすれば成功するのですか?次のように単一の変数のリターンと私のコードは次のとおりです。タプルを含むPythonからの関数呼び出しがCで返される

#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を使用していると私は本当にこれを行う方法を知らない。

+0

おそらく_ [このディスカッション](http://stackoverflow.com/a/13942236/645128)_手がかりを提供しますか? – ryyker

+0

または_ [この1つ](http://stackoverflow.com/questions/29929920/how-to-pass-a-list-array-of-structs-from-python-to-c)_ – ryyker

答えて

1

With a small caveatの場合は、PyArg_ParseTupleを使用して、呼び出した関数から返されたタプルを分割できます。

返されたタプルが、PyArg_ParseTupleに指定したフォーマット文字列と一致する限り、これは正常に動作します。不一致がある場合、PyArg_ParseTupleによって生成されたエラーは、タプルが引数タプルであることを前提としているため誤解を招きます。

あまり便利ではありませんが、より一般的なアプローチは、tuple APIを使用することです。

+0

はい。これは私のために働く。私は一般的なアプローチタプルAPIを使用します。ありがとう。 @rici –

関連する問題