上網搜了一下,發現在python 中呼叫c++中函式,網上大部分方法都是將c++編成.dll(windows下)或者.so(linux下),這樣和我們現在的需求不一致,c++寫的程式是要一直執行,當python指令碼中的httpserver接收到特定的請求再呼叫c++的函式。
現在我們就不將c++定義的函式編成.dll的方法,python弄個非常簡單的http server,接收到get請求後呼叫c++的測試函式(無參列印函式,有參的加法函式)。
其實只需要呼叫python提供的api直接在c++中建立python模組並將需要的函式初始化進去,在python中import此模組,呼叫相應的函式即可。
最主要的就是定義pymethoddef型別的陣列,例如這裡使用的:
static pymethoddef methods=, ,
};
陣列中的第乙個陣列變數中第乙個是匯出到python中使用的函式名,第二個是c++中定義的函式指標,第三個是引數型別,種類很多,我們這裡只使用兩種:無參用meth_noargs,有參用meth_varargs。第四個引數是此函式的doc說明。
c++中要實現的函式這樣定義:static pyobject* pymethoddef陣列中定義的函式指標
(pyobject *pself, pyobject *pparams); 裡面實現邏輯,第乙個引數是此函式的類型別。這裡沒用,第二個引數是python呼叫的時間傳入的。
現在我們來實現上面的簡單需求,先看看python指令碼:python_call_c++.py
"""引入c++中定義的python模組"""
] """呼叫c++中定義的no_args_function_print函式"""
moduleofdefine.no_args_function_print()
"""呼叫c++中定義的args_function_add函式"""
這個是網上down的乙個非常簡單的http伺服器,再看看c++**:
#include "python.h"
#include // 測試的無參函式
static pyobject* noargsfunctionprint(pyobject *pself, pyobject *pparams)
// 測試的有參函式
static pyobject* argsfunctionadd(pyobject *pself, pyobject *pparams)
long result = x + y;
return pyint_fromlong(result);
}// 將c++中需要匯出的函式的名字、函式位址等資訊儲存到pymethoddef型別的陣列中
// 匯出到python的函式名、函式指標、函式形式(我們這使用這兩種:meth_noargs(沒引數),meth_varargs(有引數))、函式的doc
// 最後一行的null時結束標記
static pymethoddef methods=, ,
};// 呼叫python_call_c++.py指令碼
void initpython()
// 向python中新增引數名的模組
if (!pyimport_addmodule("moduleofdefine"))
// 初始化新增的模組
pyobject *module = py_initmodule("moduleofdefine", methods);
if (!module)
pyrun_******string("import sys");
pyobject *pname = null;
pyobject *pmodule = null;
//載入python_call_c++.py指令碼
pname = pystring_fromstring("python_call_c++");
pmodule = pyimport_import(pname);
if (!pmodule)
//釋放資源
if (pname != null)
if (pmodule != null)
//關閉python
py_finalize();
}int main()
c++ **中有很詳細的注釋了,前面也說過c++中如何呼叫python,可以參考下
可以測試下,開啟c++程式後,開啟瀏覽器,輸入http://localhost:8080/就行了。
python中函式的定義及呼叫
1 函式的概念 函式是將具有獨立功能的 塊組織為乙個整體,使其具有特殊功能的 集 2 函式的作用 使用函式可以加強 的復用性,提高程式編寫的效率 3 函式的使用 函式必須先建立才可以使用,該過程稱為函式的定義,函式建立後可以使用,使用過程稱為函式呼叫 def 函式名 形參1,形參2 定義 函式體 函...
python 函式的定義與呼叫
函式的定義 def 函式名 def func print 函式的功能 函式的呼叫 函式名 遇到函式定義,簡單記錄一下 遇到了函式的呼叫,才會進入函式去執行 執行結束以後,會回到函式被呼叫的地方 繼續往下走 雙層巢狀的函式 看圖,理解直譯器的執行順序 理解輸出的結果 多層巢狀的函式 理解執行順序 輸出...
python函式的定義與呼叫
函式定義語法 def 函式名 引數列表 注釋 函式體注意 1.函式形參不需要宣告型別,也不需要指定函式返回值型別 2.即使該函式不需要接收任何引數,也必須保留一對空的圓括號 3.括號後面的冒號必不可少 4.函式體相對於def關鍵字必須保持一定的空格縮排 5.python允許巢狀定義函式 例 編寫生成...