最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python向C語言的鏈接庫傳遞數(shù)組、結(jié)構(gòu)體、指針類型的數(shù)據(jù)

 更新時(shí)間:2019年01月29日 11:51:42   作者:JimmyU1  
今天小編就為大家分享一篇關(guān)于使用Python向C語言的鏈接庫傳遞數(shù)組、結(jié)構(gòu)體、指針類型的數(shù)據(jù),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧

使用python向C語言的鏈接庫傳遞數(shù)組、結(jié)構(gòu)體、指針類型的數(shù)據(jù)

由于最近的項(xiàng)目頻繁使用python調(diào)用同事的C語言代碼,在調(diào)用過程中踩了很多坑,一點(diǎn)一點(diǎn)寫出來供大家參考,我們?nèi)匀皇鞘褂胏types來調(diào)用C語言的代碼庫。

至于如何調(diào)用基礎(chǔ)數(shù)據(jù)類型的數(shù)據(jù),請(qǐng)大家參考我的另外一篇文章:Python使用ctypes調(diào)用C/C++的方法

1. 使用python給C語言函數(shù)傳遞數(shù)組類型的參數(shù)

想必很多時(shí)候,C語言會(huì)使用數(shù)組作為參數(shù),在之前我們使用過ctypes的一些數(shù)據(jù)類型作為C語言參數(shù)類型,包括byte、short、int、double之類的,但是在使用數(shù)組類型的時(shí)候,我們也是有著類似的做法,下面我們看實(shí)例:

1.1 C語言的代碼塊

一個(gè)簡(jiǎn)單的數(shù)組輸入,以及一個(gè)簡(jiǎn)單將數(shù)組作為參數(shù)的函數(shù)

int input[2] = [0, 1]
void printIntArray(int[] input){
  for(int i = 0; i < 2; i ++){
    print(input[i]);
  }
}

1.2 python代碼塊

下面我們將演示如何調(diào)用上面的代碼

from ctypes import *
# 假設(shè)上面的代碼被編譯成了一個(gè)XXXXlib.so的文件
dll = CDLL('XXXXlib.so')
# 聲明一個(gè)數(shù)組類型
INPUT = c_int * 2
# 實(shí)例化一個(gè)長度為2的整型數(shù)組
input = INPUT()
# 為數(shù)組賦值(input這個(gè)數(shù)組是不支持迭代的)
input[0] = 1
input[1] = 2
# 引用C語言的函數(shù)
print_int_array = dll.printIntArray
# 調(diào)用C語言的函數(shù)
print_int_array(input)

1.3 小結(jié)

使用數(shù)組的方法基本就是這樣的,聲明什么類型的數(shù)組只需要根據(jù)之前python官方文檔里ctypes使用說明對(duì)照著聲明數(shù)組就可以了。

2. 使用python給C語言函數(shù)傳遞結(jié)構(gòu)體類型的參數(shù)

當(dāng)然,為了滿足一些個(gè)性化的需求和為了使程序更容易讓人理解,更多的時(shí)候開發(fā)人員也會(huì)使用結(jié)構(gòu)體類型的變量為函數(shù)賦值。現(xiàn)在我們使用ctypes來實(shí)例化一個(gè)C語言的結(jié)構(gòu)體,請(qǐng)看實(shí)例:

由于第一部分我們已經(jīng)介紹了如何簡(jiǎn)單的調(diào)用C語言的函數(shù),我們下面只寫結(jié)構(gòu)體相關(guān)的python代碼

from ctypes import *
# 聲明一個(gè)類,繼承自ctypes.Structure
class PythonStructure(Structure):
  _fields_:[('param1',c_int),('param2', c_int),('param3', c_int * 2)]
# 實(shí)例化變量
python_structure = PythonStructure()
# 賦值
python_structure.param1 = 1
python_structure.param2 = 3
PARAM = c_int * 2
param3 = PARAM()
param3[0] = 3
param3[1] = 4
python_structure.param3 = param3

從代碼中我們可以看到,我們聲明了一個(gè)class,使其繼承自ctypes.Structure,然后在類的內(nèi)部聲明了變量,fields這樣一個(gè)變量域,里面用元組存貯這結(jié)構(gòu)體的每個(gè)結(jié)構(gòu)體內(nèi)部變量的變量名和數(shù)據(jù)類型。

然后在實(shí)際的使用過程中,首先要實(shí)例化一個(gè)PythonStructure類型的變量,然后為其各個(gè)內(nèi)部變量賦值。

3. 使用python給C語言函數(shù)傳遞指針類型的參數(shù)

指針作為C語言相比于其他原因最大的優(yōu)勢(shì),在C語言程序中會(huì)大量的使用指針,因此將指針類型的數(shù)據(jù)作為參數(shù)傳遞其實(shí)是十分的普遍的,下面我們直接上實(shí)例:

3.1 C語言函數(shù)聲明

void test(pystruct *ps)

假設(shè)這里的pystruct與我們?cè)诘诙糠致暶鞯慕Y(jié)構(gòu)體相對(duì)應(yīng)(我這渣渣C語言功底實(shí)在是怕寫出什么錯(cuò)誤的代碼誤導(dǎo)大家)

3.2 python代碼

使用指針類型的數(shù)據(jù)只需要在調(diào)用btref()就可以了

from ctypes import *
# 聲明一個(gè)類,繼承自ctypes.Structure
class PythonStructure(Structure):
  _fields_:[('param1',c_int),('param2', c_int),('param3', c_int * 2)]
# 實(shí)例化變量
python_structure = PythonStructure()
# 賦值
python_structure.param1 = 1
python_structure.param2 = 3
PARAM = c_int * 2
param3 = PARAM()
param3[0] = 3
param3[1] = 4
python_structure.param3 = param3
# 開始調(diào)用
dll = CDLL('XXXXlib.so')
test = dll.test
# 傳遞參數(shù)
test(byref(python_structure))

4.寫在最后

以上就是我們今天踩過的坑,其實(shí)發(fā)現(xiàn)網(wǎng)上對(duì)于ctypes的相關(guān)文章不是很多,因此想寫出來跟大家分享一下,希望大家少踩坑,快速的完成任務(wù),遠(yuǎn)離加班,周末愉快!

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • python中的時(shí)區(qū)問題

    python中的時(shí)區(qū)問題

    這篇文章主要介紹了python中的時(shí)區(qū)問題的相關(guān)資料,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • 詳解用Python爬蟲獲取百度企業(yè)信用中企業(yè)基本信息

    詳解用Python爬蟲獲取百度企業(yè)信用中企業(yè)基本信息

    這篇文章主要介紹了詳解用Python爬蟲獲取百度企業(yè)信用中企業(yè)基本信息,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 基于python的selenium兩種文件上傳操作實(shí)現(xiàn)詳解

    基于python的selenium兩種文件上傳操作實(shí)現(xiàn)詳解

    這篇文章主要介紹了基于python的selenium兩種文件上傳操作實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Python中將字典轉(zhuǎn)換為XML以及相關(guān)的命名空間解析

    Python中將字典轉(zhuǎn)換為XML以及相關(guān)的命名空間解析

    這篇文章主要介紹了Python中將字典轉(zhuǎn)換為XML以及相關(guān)的命名空間解析,包括使用字典創(chuàng)建XML等知識(shí),需要的朋友可以參考下
    2015-10-10
  • Python提取PDF內(nèi)容的方法(文本、圖像、線條等)

    Python提取PDF內(nèi)容的方法(文本、圖像、線條等)

    這篇文章主要介紹了Python提取PDF內(nèi)容的方法(文本、圖像、線條等),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Python學(xué)習(xí)之Anaconda的使用與配置方法

    Python學(xué)習(xí)之Anaconda的使用與配置方法

    我在學(xué)習(xí)Python的爬蟲框架中看到看到了anaconda的介紹,簡(jiǎn)直是相見恨晚啊,我覺的每個(gè)Python的學(xué)習(xí)網(wǎng)站上首先都應(yīng)該使用anaconda來進(jìn)行教程,因?yàn)樵趯?shí)踐的過程中光環(huán)境的各種報(bào)錯(cuò)就能消磨掉你所有的學(xué)習(xí)興趣
    2018-01-01
  • Python中使用dom模塊生成XML文件示例

    Python中使用dom模塊生成XML文件示例

    這篇文章主要介紹了Python中使用dom模塊生成XML文件示例,本文講解了dom模塊的主要方法、詳細(xì)的代碼實(shí)例,需要的朋友可以參考下
    2015-04-04
  • python解決字典中的值是列表問題的方法

    python解決字典中的值是列表問題的方法

    這篇文章主要介紹了字典中的值是列表問題,先用value連成一個(gè)str,最后用str.split()作一個(gè)轉(zhuǎn)換,生成一個(gè)列表.看了python cookbook,上面正好有一個(gè)recipe講到如何處理這樣的問題
    2013-03-03
  • python將字典內(nèi)容存入mysql實(shí)例代碼

    python將字典內(nèi)容存入mysql實(shí)例代碼

    這篇文章主要介紹了python將字典內(nèi)容存入mysql實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • python用socket實(shí)現(xiàn)協(xié)議TCP長連接框架

    python用socket實(shí)現(xiàn)協(xié)議TCP長連接框架

    大家好,本篇文章主要講的是python用socket實(shí)現(xiàn)協(xié)議TCP長連接框架,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02

最新評(píng)論

紫云| 周宁县| 永川市| 阜康市| 沾益县| 桓台县| 牡丹江市| 阿拉善盟| 陕西省| 开封县| 青铜峡市| 冕宁县| 富源县| 洛浦县| 河西区| 丘北县| 通化县| 广南县| 罗平县| 贵德县| 建湖县| 北海市| 紫阳县| 金湖县| 朝阳区| 凉城县| 玉环县| 鱼台县| 天全县| 平塘县| 伽师县| 海城市| 阜宁县| 元谋县| 沂水县| 开封县| 东丽区| 清丰县| 建阳市| 德安县| 盘锦市|