python - Linux C調用Python 函數


1.Python腳本,名稱為py_add.py

def add(a=1,b=1):
    print('Function of python called!')
    print('a = ',a)
    print('b = ',b)
    print('a + b = ',a+b)
    

2.C代碼

#include <stdio.h>
#include <stdlib.h>
#include <Python.h>

int main(int argc,char **argv)
{
    //初始化,載入python的擴展模塊
    Py_Initialize();
    //判斷初始化是否成功
    if(!Py_IsInitialized())
        {
            printf("Python init failed!\n");
            return -1;
        }
    //PyRun_SimpleString 為宏,執行一段python代碼
    //導入當前路徑
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");

    PyObject *pName = NULL;
    PyObject *pModule = NULL;
    PyObject *pDict = NULL;
    PyObject *pFunc = NULL;
    PyObject *pArgs = NULL;

    //加載名為py_add的python腳本
    pName = PyString_FromString("py_add");
    pModule = PyImport_Import(pName);
    if(!pModule)
        {
            printf("Load py_add.py failed!\n");
            getchar();
            return -1;
        }
    pDict = PyModule_GetDict(pModule);
    if(!pDict)
        {
            printf("Can't find dict in py_add!\n");
            return -1;
        }
        
    pFunc = PyDict_GetItemString(pDict,"add");
    if(!pFunc || !PyCallable_Check(pFunc))
        {
            printf("Can't find function!\n");
            getchar();
            return -1;
        }
    /*
    向Python傳參數是以元組(tuple)的方式傳過去的,
    因此我們實際上就是構造一個合適的Python元組就
    可以了,要用到PyTuple_New,Py_BuildValue,PyTuple_SetItem等幾個函數
    */
    pArgs = PyTuple_New(2);
    
    //  PyObject* Py_BuildValue(char *format, ...) 
    //  把C++的變量轉換成一個Python對象。當需要從 
    //  C++傳遞變量到Python時,就會使用這個函數。此函數 
    //  有點類似C的printf,但格式不同。常用的格式有 
    //  s 表示字符串, 
    //  i 表示整型變量, 如Py_BuildValue("ii",123,456)
    //  f 表示浮點數, 
    //  O 表示一個Python對象
    PyTuple_SetItem(pArgs,0,Py_BuildValue("i",123));
    PyTuple_SetItem(pArgs,1,Py_BuildValue("i",321));

    //調用python的add函數
    PyObject_CallObject(pFunc,pArgs);

    //清理python對象
    if(pName)
        {
            Py_DECREF(pName);
        }
    if(pArgs)
        {
            Py_DECREF(pArgs);
        }
    if(pModule)
        {
            Py_DECREF(pModule);
        }
    
    //關閉python調用
    Py_Finalize();

    return 0;
    
}

3,編譯

gcc -I/usr/include/python2.7/  mian.c -o main -L/usr/lib/ -lpython2.7

備注:鏈接Python的庫需在最后,否則可能會出現以下的錯誤提示:

undefined reference to 'Py_Initialize'

4,運行結果

 5.參考文章:C++調用Python淺析  http://blog.csdn.net/magictong/article/details/8947892


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM