<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 閱讀(681) 評論(1)  編輯  收藏 所屬分類: C&C++

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

    不然Python不會進行垃圾回收,因為它看到對象仍被引用。  回復  更多評論
      
    主站蜘蛛池模板: 最近中文字幕mv手机免费高清| 野花香高清视频在线观看免费| 黄页网站免费观看| 成人无码区免费A∨直播| 亚洲精品成a人在线观看| 亚洲av无码乱码国产精品| 亚洲av无码专区在线| 99热亚洲色精品国产88| 亚洲免费福利在线视频| 亚洲综合色一区二区三区| 伊人久久大香线蕉免费视频| 亚洲夜夜欢A∨一区二区三区| 水蜜桃视频在线观看免费播放高清| 精品国产亚洲一区二区三区| 久久99精品国产免费观看| 亚洲春黄在线观看| 日本黄色免费观看| 337p日本欧洲亚洲大胆色噜噜 | 老司机在线免费视频| 国产成人精品日本亚洲专一区| 蜜桃精品免费久久久久影院| 偷自拍亚洲视频在线观看| 狠狠综合久久综合88亚洲| 91免费国产精品| 亚洲av日韩aⅴ无码色老头| 亚洲国产精品专区在线观看| 久久精品免费观看| 亚洲av永久无码精品三区在线4| 免费人成在线观看播放国产| 亚洲国产精品日韩在线观看| 精品免费久久久久久成人影院| 一区二区视频在线免费观看| 久久精品亚洲中文字幕无码麻豆| 精品国产福利尤物免费| 亚洲黄色在线电影| xvideos亚洲永久网址| 亚洲女子高潮不断爆白浆| 国产免费一区二区三区| 特级毛片全部免费播放| 国产aa免费视频| 四虎国产精品永久免费网址|