python3.6.3編寫(xiě)一個(gè)簡(jiǎn)單程序 Python如何嵌入C/C 進(jìn)行開(kāi)發(fā)?
Python如何嵌入C/C 進(jìn)行開(kāi)發(fā)?要是要在Python中包裝2個(gè)裝甲旅的C或C功能,則有很多選擇是可以要做。一個(gè)比較簡(jiǎn)單是,我們是可以試著手動(dòng)裸芯片嘗試下如何用Python導(dǎo)進(jìn)C/C并且開(kāi)發(fā)。自
Python如何嵌入C/C 進(jìn)行開(kāi)發(fā)?
要是要在Python中包裝2個(gè)裝甲旅的C或C功能,則有很多選擇是可以要做。一個(gè)比較簡(jiǎn)單是,我們是可以試著手動(dòng)裸芯片嘗試下如何用Python導(dǎo)進(jìn)C/C并且開(kāi)發(fā)。
自動(dòng)整體封裝假如您要包裝的C/C代碼低些相對(duì)多,則是可以手動(dòng)能完成。文檔的“儲(chǔ)存和嵌入”部分是兩個(gè)非常好的參考。
當(dāng)我為C和C代碼編寫(xiě)包裝器時(shí),大多數(shù)會(huì)為代碼提供一個(gè)過(guò)程接口,然后再不使用Python構(gòu)造一個(gè)面向?qū)ο蟮慕涌?。我那樣的?huà)做是只是因?yàn)閮蓚€(gè)原因:首先,將C對(duì)象不會(huì)暴露給Python很麻煩;如果你是,我更不喜歡用Pythonc語(yǔ)言程序高層結(jié)構(gòu),而不是用C匯編語(yǔ)言它們。
讓我們看一個(gè)基本上的包裝器:文件“hello.c”中有一個(gè)函數(shù)“hi~”?!癶i~”的定義如下:
char*嗨小伙伴們(char*what)要不自動(dòng)封裝方法,我們是需要先執(zhí)行以下操作。
首先,編譯程序一個(gè)Python可調(diào)用函數(shù),該函數(shù)認(rèn)可一個(gè)字符串并直接返回一個(gè)字符串。
或者,在模塊的符號(hào)表中注冊(cè)一此函數(shù)(所有Python函數(shù)都必然于模塊中,就算它們雖然是C函數(shù)也這般?。?/p>
第三,為模塊c語(yǔ)言設(shè)計(jì)一個(gè)初始化函數(shù)(所有擴(kuò)展模塊都不需要一個(gè)系統(tǒng)初始化函數(shù))。
第四,編寫(xiě)一個(gè)腳本:
況且在此簡(jiǎn)單級(jí)別上,此代碼也有兩個(gè)方面愿意討論。
錯(cuò)誤處理請(qǐng)盡量PyArg_ParseTuple內(nèi)部函數(shù)。該動(dòng)態(tài)創(chuàng)建告知Python,“hello!”包裝函數(shù)正好采用一個(gè)參數(shù),即字符串(“s”來(lái)表示“字符串”;“ss”它表示“兩個(gè)字符串”;“si”來(lái)表示“字符串和整數(shù)”))。CAPI與Python的約定是,從回PyObject*的函數(shù)回NULL意思是已突然;在情況下,出現(xiàn)錯(cuò)誤信息是在PyArg_ParseTuple中系統(tǒng)設(shè)置的,我們只是因?yàn)榘凑辗祷豊ULL在堆棧上訊息傳遞錯(cuò)誤。
直接引用數(shù)器Python在直接引用定時(shí)計(jì)數(shù)系統(tǒng)上工作好:突然之間一個(gè)函數(shù)“擁有”一個(gè)對(duì)象的所有權(quán)(比如,將其怎么分配給列表或字典),它都會(huì)可以使用Py_INCREF使該對(duì)象的摘錄計(jì)數(shù)寄存器減少1。當(dāng)將該對(duì)象從該特定的事件位置刪除(.例如,從列表或字典中刪出)時(shí),直接引用計(jì)數(shù)寄存器將使用Py_DECREF會(huì)減少。當(dāng)引用計(jì)數(shù)提升0時(shí),Python會(huì)清楚該對(duì)象未被任何對(duì)象可以使用,因此也可以施放該對(duì)象(不過(guò),可能會(huì)不會(huì)立玄能量它)。
我想知道為什么這么說(shuō)有用?好吧,我們正在用PyString_FromString在此代碼中創(chuàng)建角色一個(gè)PyObject。我們是需要INCREF嗎?要得出答案答案,請(qǐng)查找PyString_FromString的文檔:
#l2h-461看見(jiàn)了哪里寫(xiě)著“新參考”?這意味著它將取走直接引用計(jì)數(shù)法為1的對(duì)象,這就是我們想的。如果不是它說(shuō)“憑借的腳注”,這樣的話(huà)我們不需要在返回對(duì)象之前先對(duì)對(duì)象參與INCREF,以因?yàn)槲覀內(nèi)绻芊峙涞膬?nèi)存還能夠在函數(shù)結(jié)束后再未知。
這是一種考慮到摘錄的方法:
如果您從PythonAPI收到消息Python對(duì)象,則也可以在自己的C代碼中建議使用它,而不必增加它的引用。
如果您想絕對(duì)的保證Python對(duì)象這個(gè)可以在您自己的C代碼末尾保留過(guò)來(lái),則必須INCREF。
如果您從Python代碼收到消息一個(gè)對(duì)象,并且它是一個(gè)新腳注,只不過(guò)您不希望它在您自己的C代碼末尾可以生存過(guò)來(lái),則應(yīng)該對(duì)它并且DECREF。
順便說(shuō)一句,如果您想前往None,則可以不不使用Py_None。記住要INCREF!
一個(gè)注意事項(xiàng):我講到了建議使用PyCObjects傳信不透明的C/C數(shù)據(jù)類(lèi)型。假如您使用Python來(lái)組織代碼,不過(guò)這具高不不需要訪問(wèn)網(wǎng)絡(luò)Python的古怪結(jié)構(gòu),則這很有用嗎。
您可以不將指針包裝在PyCObjects中(如果沒(méi)有要,也可以使用關(guān)聯(lián)的析構(gòu)函數(shù)),此時(shí)它們不變不透明的Python對(duì)象,其內(nèi)存由Python解釋什么器管理
。這個(gè)可以在示例代碼看見(jiàn)一個(gè)例子,下code/hello,hello/hellmodule.c,函數(shù)cobj_in,cobj_土爆以及free_loving_struct,它通過(guò)不使用PyCObject包裝的分配的C結(jié)構(gòu)又回到Python。
總結(jié)
所以,這是麻煩問(wèn)下怎么自動(dòng)裸芯片Python的簡(jiǎn)短精悍介紹。但,您可能會(huì)會(huì)猜到,有許多項(xiàng)目一類(lèi)作用于自動(dòng)出現(xiàn)整體封裝代碼。所以我半自動(dòng)裸芯片接觸下用Python導(dǎo)進(jìn)C/C參與開(kāi)發(fā),其他的大家是可以搜索看看,也很好帶的是SWIG、pyrex和ctypes的等。
怎么用sublimetext編寫(xiě)并運(yùn)行python程序?怎么設(shè)置?
1.
可以打開(kāi)sublimetext3,然后把新建一個(gè)Python文件。
2.
新建任務(wù)Python文件后,再點(diǎn)擊sublimetext軟件頂部的【文件】,在彈出來(lái)的選項(xiàng)中點(diǎn)擊【需要保存】
3.
后再然后點(diǎn)擊sublimetext菜單欄的【Tool】選項(xiàng),在彈出對(duì)話(huà)框的選項(xiàng)中然后點(diǎn)擊【編譯系統(tǒng)】,在二級(jí)菜單中選擇類(lèi)型【Python】編譯語(yǔ)言就可以了。假如您要不運(yùn)行其他的語(yǔ)言,您是可以讓其可以修改。
4.
再點(diǎn)擊sublimetext菜單欄的【Tool】選項(xiàng),在彈出對(duì)話(huà)框的餓選項(xiàng)中直接點(diǎn)擊【立刻編譯程序】就可以了。