<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-208  評論-469  文章-30  trackbacks-0



    代碼如下,分別演示直接執行python語句、無返回無參數函數調用、返回單參數函數調用。返回多參數函數調用:

    #include <Python.h>
    #include <iostream>
    using namespace std;

    //執行python命令
    void ExecPythonCommand()
    {
     //直接執行
     PyRun_SimpleString("from time import time,ctime\n"
      "print 'Today is',ctime(time())\n");
    }

    //調用無參數函數
    void InvokeNoParm()
    {
     PyObject* pMod = NULL;
     PyObject* pFunc = NULL;
     //導入模塊
     pMod = PyImport_ImportModule("Life");
     if(pMod)
     {
      //獲取函數地址
      pFunc = PyObject_GetAttrString(pMod, "a");
      if(pFunc)
      {
       //函數調用
       PyEval_CallObject(pFunc, NULL);
      }
      else
      {
       cout << "cannot find function a" << endl;
      }
     }
     else
     {
      cout << "cannot find Life.py" << endl;
     }
    }

    //調用一參數函數
    void InvokeWith1Parm()
    {
     PyObject* pMod = NULL;
     PyObject* pFunc = NULL;
     PyObject* pParm = NULL;
     PyObject* pRetVal = NULL;
     int   iRetVal = 0;
     //導入模塊
     pMod = PyImport_ImportModule("FuncDef");
     if(pMod)
     {
      pFunc = PyObject_GetAttrString(pMod, "square");
      if(pFunc)
      {
       //創建參數
       pParm = Py_BuildValue("(i)", 5);
       //函數調用
       pRetVal = PyEval_CallObject(pFunc, pParm);
       //解析返回值
       PyArg_Parse(pRetVal, "i", &iRetVal);
       cout << "square 5 is: " << iRetVal << endl;
      }
      else
      {
       cout << "cannot find function square" << endl;
      }
     }
     else
     {
      cout << "cannot find FuncDef.py" << endl;
     }
    }

    //調用多參數函數
    void InvokeWith2Parm()
    {
     PyObject* pMod = NULL;
     PyObject* pFunc = NULL;
     PyObject* pParm = NULL;
     PyObject* pRetVal = NULL;
     int   iRetVal = 0;
     //導入模塊
     pMod = PyImport_ImportModule("add");
     if(pMod)
     {
      pFunc = PyObject_GetAttrString(pMod, "add");
      if(pFunc)
      {
       //創建兩個參數
       pParm = PyTuple_New(2);
       //為參數賦值
       PyTuple_SetItem(pParm, 0, Py_BuildValue("i",2000));
       PyTuple_SetItem(pParm, 1, Py_BuildValue("i",3000));
       //函數調用
       pRetVal = PyEval_CallObject(pFunc, pParm);
       //解析返回值
       PyArg_Parse(pRetVal, "i", &iRetVal);
       cout << "2000 + 3000 = " << iRetVal << endl;
      }
      else
      {
       cout << "cannot find function square" << endl;
      }
     }
     else
     {
      cout << "cannot find add.py" << endl;
     }
    }

    int main(int argc, char* argv[])
    {
     Py_Initialize(); //python 解釋器的初始化
     
     ExecPythonCommand();
     InvokeNoParm();
     InvokeWith1Parm();
     InvokeWith2Parm();

     Py_Finalize();  // 垃圾回收、清除導入庫
     return 0;
    }


    習慣C++的內存分配釋放,突然間不用釋放,感覺很蹊蹺,上網查發現也沒有釋放函數。如果真這樣的話,是很可怕的,因為無法自己管理內存,但是我相信編譯器作者的垃圾回收機制,所以OK,不管!!

    代碼下載

    posted on 2006-01-17 20:04 EricWong 閱讀(668) 評論(1)  編輯  收藏 所屬分類: C&C++

    評論:
    # re: C++之python函數調用 2007-09-04 17:39 | 金慶
    應該調用Py_DECREF()釋放內存,
    例如:
    Py_DECREF(pMod);

    不然Python不會進行垃圾回收,因為它看到對象仍被引用。  回復  更多評論
      
    主站蜘蛛池模板: 久久国产精品国产自线拍免费| 亚洲精品一品区二品区三品区| 精品亚洲国产成AV人片传媒| 国产做国产爱免费视频| 国产精品亚洲mnbav网站 | 国产亚洲精品2021自在线| 最新69国产成人精品免费视频动漫 | 亚洲精品无码鲁网中文电影| 国产免费一级高清淫曰本片| 亚洲午夜久久久久久久久久| 久久久久国色AV免费观看| 亚洲热妇无码AV在线播放| 国产一区二区三区免费| 亚洲视频一区调教| 国产精品1024永久免费视频| 亚洲高清中文字幕免费| 国产精品视频免费一区二区三区| 日韩亚洲人成在线综合| 久久亚洲欧洲国产综合| 最近2019中文免费字幕在线观看| 久久久久亚洲AV成人无码| 免费精品无码AV片在线观看| 亚洲免费在线视频播放| 四虎影视大全免费入口| 免费无码午夜福利片| 亚洲国产日韩在线视频| 7x7x7x免费在线观看| 亚洲欧好州第一的日产suv| 免费国产真实迷j在线观看| 中文字幕免费人成乱码中国| 内射少妇36P亚洲区| 成人男女网18免费视频| 免费无码专区毛片高潮喷水| 亚洲狠狠婷婷综合久久久久| 1000部羞羞禁止免费观看视频| 亚洲成av人片在线天堂无| 自拍偷自拍亚洲精品被多人伦好爽 | 午夜免费国产体验区免费的| 国产亚洲一区二区三区在线观看| 95老司机免费福利| 日本系列1页亚洲系列|