一直對不同語言間的交互感興趣,python和C語言又深有淵源,所以對python和c語言交互產(chǎn)生了興趣。
滁州網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)于2013年開始到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
最近了解了python提供的一個外部函數(shù)庫 ctypes , 它提供了C語言兼容的幾種數(shù)據(jù)類型,并且可以允許調(diào)用C編譯好的庫。
這里是閱讀相關(guān)資料的一個記錄,內(nèi)容大部分來自 官方文檔 。
ctypes 提供了一些原始的C語言兼容的數(shù)據(jù)類型,參見下表,其中第一列是在ctypes庫中定義的變量類型,第二列是C語言定義的變量類型,第三列是Python語言在不使用ctypes時定義的變量類型。
創(chuàng)建簡單的ctypes類型如下:
使用 .value 訪問和改變值:
改變指針類型的變量值:
如果需要直接操作內(nèi)存地址的數(shù)據(jù)類型:
下面的例子演示了使用C的數(shù)組和結(jié)構(gòu)體:
創(chuàng)建指針實(shí)例
使用cast()類型轉(zhuǎn)換
類似于C語言定義函數(shù)時,會先定義返回類型,然后具體實(shí)現(xiàn)再定義,當(dāng)遇到下面這種情況時,也需要這么干:
可以簡單地將"so"和"dll"理解成Linux和windows上動態(tài)鏈接庫的指代,這里我們以Linux為例。注意,ctypes提供的接口會在不同系統(tǒng)上有出入,比如為了加載動態(tài)鏈接庫, 在Linux上提供的是 cdll , 而在Windows上提供的是 windll 和 oledll 。
ctypes會尋找 _as_paramter_ 屬性來用作調(diào)用函數(shù)的參數(shù)傳入,這樣就可以傳入自己定義的類作為參數(shù),示例如下:
用 argtypes 和 restype 來指定調(diào)用的函數(shù)返回類型。
這里我只是列出了 ctypes 最基礎(chǔ)的部分,還有很多細(xì)節(jié)請參考官方文檔。
這兩天文章沒有寫,先是早出晚歸出去玩了一整天,然后加班到凌晨3點(diǎn)左右,一天一篇計劃劃水得嚴(yán)重啊…
有兩種方法:
一、
通過返回內(nèi)部中定義的方法再在外部調(diào)用,像這樣:
def a():
def b():
print('b')
return b
a()()
class c:
def f(self):
def g():
print ('g')
return g
c().f()()
這是運(yùn)行截圖:
二、
直接將內(nèi)部方法定義成global的,像這樣:
def a():
global b
def b():
print('bbb')
a()
b()
class c:
def f(self):
global g
def g():
print ('ggg')
c().f()
g()
這是運(yùn)行截圖:
下面的例子演示了用3種方法來在外部引用函數(shù)內(nèi)部定義的列表:
#返回函數(shù)內(nèi)部定義的列表
def int_list1():
l=[1,2]
return l
#將函數(shù)內(nèi)部列表定義成全局的
def int_list2():
global l
l=[3,4]
#將函數(shù)內(nèi)部列表定義成函數(shù)的一個屬性
def int_list3():
l=[5,6]
int_list3.l=l
print(int_list1())
int_list2()
print(l)
int_list3()
print(int_list3.l)
這是截圖: