步驟1:安裝Python開發(fā)包
站在用戶的角度思考問題,與客戶深入溝通,找到鎮(zhèn)沅網(wǎng)站設(shè)計與鎮(zhèn)沅網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計制作、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋鎮(zhèn)沅地區(qū)。
由于需要訪問Python/C API,首先安裝Python開發(fā)包。
在Debian,Ubuntu或Linux Mint中:
在CentOS,F(xiàn)edora或RHEL中:
安裝成功后,Python頭文件在/usr/include/python2.7。根據(jù)Linux發(fā)行版的不同,確切的路徑可能是不相同的。例如,CentOS 6中是/usr/include/python2.6。
步驟2:初始化解釋器并設(shè)置路徑
C中嵌入Python的第一步是初始化Python解釋器,這可以用以下C函數(shù)完成。
初始化解釋器后,需要設(shè)置你的C程序中要導(dǎo)入的Python模塊的路徑。例如,比如你的Python模塊位于/usr/local/modules。然后使用以下C函數(shù)調(diào)用來設(shè)置路徑。
步驟3:數(shù)據(jù)轉(zhuǎn)換
C中嵌入Python最重要的方面之一是數(shù)據(jù)轉(zhuǎn)換。從C中傳遞數(shù)據(jù)到Python函數(shù),需要首先將數(shù)據(jù)從C數(shù)據(jù)類型轉(zhuǎn)換到Python數(shù)據(jù)類型。Python/C API提供各種函數(shù)來實(shí)現(xiàn)這。例如,轉(zhuǎn)換C字符串到Python字符串,使用PyString_FromString函數(shù)。
另外一個類似函數(shù)PyInt_FromLong,將C中l(wèi)ong數(shù)據(jù)類型轉(zhuǎn)換為Python int。每個Python/C API函數(shù)返回一個PyObject類型的引用。
步驟4:定義一個Python模塊
當(dāng)你想嵌入Python代碼到另一種語言如C,該代碼需要被寫成Python模塊,然后用另一種語言“導(dǎo)入”。所以讓我們來看看如何在C中導(dǎo)入Python模塊。
為了進(jìn)行說明,我們實(shí)現(xiàn)一個簡單的Python模塊例子如下:
以上的Python函數(shù)有一個字符串作為參數(shù)并返回兩個重復(fù)的字符串。例如,如果輸入字符串是“cyberpersons”,該函數(shù)返回'cyberpersonscyberpersons'。此模塊文件命名為“printData.py”并將它放在前面聲明的Python模塊目錄中(/usr/local/modules)。
步驟5:加載一個Python模塊
現(xiàn)在你已經(jīng)定義了Python模塊,是時候在C程序中加載它了。導(dǎo)入模塊的C代碼看起來像這樣:
步驟6:構(gòu)建函數(shù)的參數(shù)
當(dāng)加載一個模塊時,可以調(diào)用模塊中定義的Python函數(shù)。通常,我們需要傳遞一個或多個參數(shù)到一個Python函數(shù)。我們必須構(gòu)建一個Python元組對象,它包括Python函數(shù)中的參數(shù)。
在我們的例子中,printData函數(shù)定義帶一個參數(shù)的模塊。因此,我們構(gòu)建一個大小是一的Python元組對象如下。我們可以使用PyTuple_SetItem設(shè)置元組對象的每個項。
我們已經(jīng)成功構(gòu)建一個參數(shù)傳遞到函數(shù)調(diào)用,是時候從C程序調(diào)用python函數(shù)了。
步驟7:調(diào)用Python函數(shù)
一旦成功創(chuàng)建Python元組對象作為函數(shù)參數(shù),我們可以調(diào)用一個帶參數(shù)的Python函數(shù)。為此,通過使用PyObject_GetAttrString首先獲得模塊中定義的函數(shù)的引用,然后使用PyObject_CallObject調(diào)用該函數(shù)。例如:
步驟8:錯誤檢查
避免運(yùn)行時錯誤的常見方法是檢查函數(shù)的返回值并根據(jù)返回值采取適當(dāng)?shù)男袆印n愃朴贑程序中的全局變量errno,Python/C API提供一個全局指示符,它報告最后發(fā)生的錯誤。當(dāng)Python/C API函數(shù)失敗,全局指示符設(shè)置為指示錯誤,并且PyErr_Print可以用于顯示相應(yīng)的人類可讀的trackback。例如:
在你的應(yīng)用程序中,你可以輕松地將各種錯誤檢查。
這里是完整的C程序,它如本教程描述的嵌入Python代碼。
步驟9:編譯和執(zhí)行
保存以上代碼到finalCode.c,并且鏈接Python庫(-lpython2.7)編譯該代碼。根據(jù)發(fā)行版的不同,可能使用不同的版本(例如,-lpython2.6)。
可以使用Python的ctypes模塊來實(shí)現(xiàn)C和Python之間的通信,從而實(shí)現(xiàn)C調(diào)用Python訓(xùn)練模型的輸入。
ctypes模塊提供了一種調(diào)用共享庫的方法,可以將Python的變量和函數(shù)轉(zhuǎn)換為C語言的變量和函數(shù),從而實(shí)現(xiàn)C調(diào)用Python的功能。
要實(shí)現(xiàn)C調(diào)用Python訓(xùn)練模型的輸入,需要做的第一步是在C程序中定義一個Python函數(shù),并將其轉(zhuǎn)換為C函數(shù)。然后,可以使用ctypes模塊將Python函數(shù)轉(zhuǎn)換為C函數(shù),從而實(shí)現(xiàn)C調(diào)用Python訓(xùn)練模型的輸入。
C語言不能直接調(diào)用Python源程序,但是可以通過進(jìn)程調(diào)用來實(shí)現(xiàn)。
下面是一個例子:
首先是python的一個簡單函數(shù)
class Hello:
def __init__(self, x):
self.a = x
def print(self, x=None):
print(x)
def xprint():
print("hello world")
if __name__ == "__main__":
xprint()
h = Hello(5)
h.print()1
下面是C語言
#include python3.4m/Python.h
#include stdio.h
#include stdlib.h
#include string.h
int main()
{
Py_Initialize();
// 將當(dāng)前目錄加入sys.path
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
// 導(dǎo)入hello.py模塊
PyObject *pmodule = PyImport_ImportModule("hello");
// 獲得函數(shù)xprint對象,并調(diào)用,輸出“hello world\n”
PyObject *pfunc = PyObject_GetAttrString(pmodule, "xprint");
PyObject_CallFunction(pfunc, NULL);
// 獲得類Hello并生成實(shí)例pinstance,并調(diào)用print成員函數(shù),輸出“5 6\n”
PyObject *pclass = PyObject_GetAttrString(pmodule, "Hello");
PyObject *arg = Py_BuildValue("(i)", 5);
PyObject *pinstance = PyObject_Call(pclass, arg, NULL);
PyObject_CallMethod(pinstance, "print", "i", 6);
Py_Finalize();
return 0;
}
編譯命令如下:
gcc pyapi.c -lpython3.4m -o pyapi
本文標(biāo)題:關(guān)于c使用python函數(shù)的信息
新聞來源:http://chinadenli.net/article6/dogehog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、、面包屑導(dǎo)航、商城網(wǎng)站、網(wǎng)站營銷、網(wǎng)頁設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)