在r"^ge(.{4,})")中
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),市中企業(yè)網(wǎng)站建設(shè),市中品牌網(wǎng)站建設(shè),網(wǎng)站定制,市中網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,市中網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
r表示原生字符串,即 不用對正則表達(dá)式中的反斜杠再轉(zhuǎn)義。
^ge表示以ge開頭的字符串。
.{4,}表示除回車換行符外的4個及以上的任意字符。
r"^ge(.{4,})")表示捕獲以ge開頭的字符串中g(shù)e后面的部分。
完整的Python程序如下。
import re
strip_ge = re.compile(r"^ge(.{4,})")
m=strip_ge.search('gehelloworld')
if m==None:
print(m)
else:
print(m.group(1))
源代碼(注意源代碼的縮進(jìn))
例如有3個文件 main.cpp func.h func.cpp 你要別的程序用的函數(shù)和變量都要放在 func.h 中。 main.cpp: #include "func.h" main() { myvalue = myfunc(); } func.h #ifndef FUNCH // 避免重復(fù)定義,一定要有! #define FUNCH long myfunc(); // 讓別的cpp使用函數(shù) extern long myvalue; // 讓別的cpp使用變量 #endif func.cpp long myvalue; long myfunc() { return 10; } 用上面的方法,你有隨便多少個cpp都沒有問題。 當(dāng)然要保證你用的cpp和h已經(jīng)加入工程了。 好的習(xí)慣是將類似的函數(shù)放在同一個cpp, 每個類 用自己的cpp.
在函數(shù)聲明加入前綴,如
__declspec(dllexport) int Fun(int a, int b)
否則在加載該dll時會提示找不到該符號
在windows下可以通過vs自帶的dumpbin工具查看可被調(diào)用符號
dumpbin /exports test.dll
C函數(shù)在調(diào)用過程中關(guān)于參數(shù)傳遞和壓棧由多種規(guī)定,作為dll提供給其他程序調(diào)用時,必須明確并統(tǒng)一為同一種調(diào)用規(guī)定,否則會導(dǎo)致棧破壞,編譯器負(fù)責(zé)具體實現(xiàn)調(diào)用規(guī)定,主要有以下幾種調(diào)用規(guī)定
python下調(diào)用C庫有多種方式,ctypes是其中一種比較方便的,調(diào)用時首先需要加載dll文件,根據(jù)C dll的調(diào)用規(guī)定不同需要使用不同接口,使用ctypes需要 import ctypes 庫
對于簡單的C函數(shù),例如 int add(int a, int b) , 此時就可以直接調(diào)用了,如
對于較復(fù)雜的C函數(shù)的參數(shù)情況,ctypes調(diào)用時對入?yún)⒑统霾妥鲆欢ㄌ幚?,這里分情況討論
以上包含了幾種主要的參數(shù)傳遞情況,ctypes也提供了一個較為完整的python類型和C類型的對照,如下:
步驟1:安裝Python開發(fā)包
由于需要訪問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ù)來實現(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)行說明,我們實現(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:錯誤檢查
避免運行時錯誤的常見方法是檢查函數(shù)的返回值并根據(jù)返回值采取適當(dāng)?shù)男袆?。類似于C程序中的全局變量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)。
當(dāng)前題目:python函數(shù)的編譯 Python編譯命令
本文鏈接:http://m.rwnh.cn/article38/dodoipp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、網(wǎng)站設(shè)計、軟件開發(fā)、靜態(tài)網(wǎng)站、服務(wù)器托管、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)