Python部落(python.freelycode.com)組織翻譯,,歡迎轉(zhuǎn)發(fā),。 Python是最流行的編程語(yǔ)言之一,這歸功于其簡(jiǎn)單的語(yǔ)法,,易學(xué)和跨平臺(tái)支持,。此外還由于,很多高質(zhì)量的Python庫(kù)和模塊可任意使用,,僅僅幾行代碼就允許你完成繁重的工作,。這使得Python成為開(kāi)發(fā)原型最有效的方法之一。然而,,Python沒(méi)有C語(yǔ)言快,,而且很多性能很重要的軟件產(chǎn)品如Linux操作系統(tǒng),,web服務(wù)器和數(shù)據(jù)庫(kù)都是用C編寫的。如果你用C開(kāi)發(fā)一個(gè)程序,,但是它的某些部分需要用Python編寫,,你可以編寫一個(gè)Python模塊并且使用Python/C API嵌入Python模塊到C程序中。 在本教程中,,我們研究如何使用Python/C API在C中嵌入Python代碼,。本教程以一個(gè)從C代碼調(diào)用Python的完整示例結(jié)尾。 步驟1:安裝Python開(kāi)發(fā)包由于需要訪問(wèn)Python/C API,,首先安裝Python開(kāi)發(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)用來(lái)設(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ù)來(lái)實(shí)現(xiàn)這,。例如,,轉(zhuǎn)換C字符串到Python字符串,使用PyString_FromString函數(shù),。 另外一個(gè)類似函數(shù)PyInt_FromLong,,將C中l(wèi)ong數(shù)據(jù)類型轉(zhuǎn)換為Python int。每個(gè)Python/C API函數(shù)返回一個(gè)PyObject類型的引用,。 步驟4:定義一個(gè)Python模塊當(dāng)你想嵌入Python代碼到另一種語(yǔ)言如C,,該代碼需要被寫成Python模塊,然后用另一種語(yǔ)言“導(dǎo)入”,。所以讓我們來(lái)看看如何在C中導(dǎo)入Python模塊,。 為了進(jìn)行說(shuō)明,,我們實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Python模塊例子如下: 以上的Python函數(shù)有一個(gè)字符串作為參數(shù)并返回兩個(gè)重復(fù)的字符串。例如,,如果輸入字符串是“cyberpersons”,,該函數(shù)返回'cyberpersonscyberpersons'。此模塊文件命名為“printData.py”并將它放在前面聲明的Python模塊目錄中(/usr/local/modules),。 步驟5:加載一個(gè)Python模塊現(xiàn)在你已經(jīng)定義了Python模塊,,是時(shí)候在C程序中加載它了。導(dǎo)入模塊的C代碼看起來(lái)像這樣: 步驟6:構(gòu)建函數(shù)的參數(shù)當(dāng)加載一個(gè)模塊時(shí),,可以調(diào)用模塊中定義的Python函數(shù),。通常,我們需要傳遞一個(gè)或多個(gè)參數(shù)到一個(gè)Python函數(shù),。我們必須構(gòu)建一個(gè)Python元組對(duì)象,,它包括Python函數(shù)中的參數(shù)。 在我們的例子中,,printData函數(shù)定義帶一個(gè)參數(shù)的模塊,。因此,我們構(gòu)建一個(gè)大小是一的Python元組對(duì)象如下,。我們可以使用PyTuple_SetItem設(shè)置元組對(duì)象的每個(gè)項(xiàng),。 我們已經(jīng)成功構(gòu)建一個(gè)參數(shù)傳遞到函數(shù)調(diào)用,是時(shí)候從C程序調(diào)用python函數(shù)了,。 步驟7:調(diào)用Python函數(shù)一旦成功創(chuàng)建Python元組對(duì)象作為函數(shù)參數(shù),,我們可以調(diào)用一個(gè)帶參數(shù)的Python函數(shù)。為此,,通過(guò)使用PyObject_GetAttrString首先獲得模塊中定義的函數(shù)的引用,,然后使用PyObject_CallObject調(diào)用該函數(shù)。例如: 步驟8:錯(cuò)誤檢查避免運(yùn)行時(shí)錯(cuò)誤的常見(jiàn)方法是檢查函數(shù)的返回值并根據(jù)返回值采取適當(dāng)?shù)男袆?dòng),。類似于C程序中的全局變量errno,,Python/C API提供一個(gè)全局指示符,它報(bào)告最后發(fā)生的錯(cuò)誤,。當(dāng)Python/C API函數(shù)失敗,,全局指示符設(shè)置為指示錯(cuò)誤,并且PyErr_Print可以用于顯示相應(yīng)的人類可讀的trackback,。例如: 在你的應(yīng)用程序中,,你可以輕松地將各種錯(cuò)誤檢查。 這里是完整的C程序,,它如本教程描述的嵌入Python代碼,。 步驟9:編譯和執(zhí)行保存以上代碼到finalCode.c,并且鏈接Python庫(kù)(-lpython2.7)編譯該代碼。根據(jù)發(fā)行版的不同,,可能使用不同的版本(例如,,-lpython2.6)。 現(xiàn)在使用三個(gè)參數(shù)運(yùn)行編譯的可執(zhí)行文件: 本例中的三個(gè)參數(shù)是模塊名,、模塊中函數(shù)名,、傳遞到Python函數(shù)的字符串參數(shù)。 輸出會(huì)是這樣的: 希望這可以幫助你,。 英文原文:http:///embed-python-code-in-c.html |
|