999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Ubuntu系統中Python無縫調用C程序的實現

2018-12-05 09:08:46韋立梅張淑榮
電腦與電信 2018年9期
關鍵詞:程序

韋立梅 張淑榮

(廣東白云學院,廣東 廣州 510450)

1 引言

隨著人工智能、大數據計算、系統運維、網絡爬蟲等技術的興起,Python作為目前最火的腳本語言,以其優雅、簡單、功能強大、開發效率高、跨平臺等優點,被廣泛應用于這些領域。C語言是一種編譯型語言,介于高級和低級語言之間,C程序的運行必須要經過編譯后,生成機器碼,然后再運行,執行速度快,但不能跨平臺,目前主要用于操作系統、驅動等底層的開發。在實際開發中,程序員往往會把程序中的性能瓶頸部分的實現,以擴展的方式用C程序來完成,而業務邏輯部分的實現,則用Python這種高度集成、適合開發大型項目的程序設計語言來完成,從而揚長避短,充分發揮出兩種語言的各自優勢。

2 用C語言擴展Python的流程

(1)創建C源代碼(.c);

(2)把C源代碼打包成庫文件,也就是Python類型適配,創建包裹函數(.c),包裝C代碼;

(3)編譯與測試。

3 具體實現步驟

3.1 創建C程序功能源代碼

(1)首先進入Ubuntu系統,這里選擇在桌面下,新建一個文件夾pythonexc(以下創建的所有文件/夾都存放在該文件夾中,以方便管理),在該文件夾中創建一個名為MaxRun.c的源文件,實現定義一個求兩數最大值的函數maxn,并在主函數main中調用maxn這個函數。具體代碼如下:

(2)打開Ubuntu中的終端窗口,使用cd命令進入到桌面的pythonexc文件夾,然后使用gcc命令對C源文件編譯鏈接生成可執行文件后,并運行,看結果是否正確(在這步一定要保證所編寫C代碼的正確性,以避免在Python中調試C的麻煩),編譯及輸出結果如下圖1所示,若正確,再將main函數重命名為如test(作為擴展模塊,不能有main函數,避免同名沖突),才能進行下一步的操作。

圖1 gcc編譯及運行后的輸出結果

(3)編寫相應的MaxRun.h頭文件,將定義的兩個函數maxn和test封裝到該頭文件里,在包裹模塊中需要調用它,代碼如下:

3.2 創建包裹模塊,包裝編寫好的C代碼

包裹模塊是C源代碼與Python解釋器之間進行交互的橋梁。Python和C就是通過這個模塊,完成無縫適配的。在剛建好的pythonexc文件夾中,新建一個名字為MaxRun-Wrapper.c的源文件,作為MaxRun.c的包裹模塊。包裹模塊的代碼從上到下主要分為四部分:

第一部分代碼:包含Python.h等的頭文件。

Python.h頭文件一般存放在/usr/local/include/python2.x中,如果沒有可以在終端輸入命令:sudo apt-get install python-dev,安裝Python。在包裹函數的最上面加入如下四行C代碼:

第二部分代碼:為被包裹的C功能源代碼(MaxRun)中所寫的每一個函數(maxn和test)增加一個靜態的PyObject*Module_func()的包裹函數。

包裹函數的作用就是在Python和C之間完成數據類型的轉換。每個包裹函數的返回類型為PyObject*,包裹函數的名字:模塊_函數名,如本例中應為兩個函數命名為Max-Run_maxn和MaxRun_test,相應的包裹函數代碼及功能說明如圖2所示。

圖2 包裹函數代碼及功能說明

第三部分:為模塊增加一個PyMethodDef Module-Methods[]的函數聲明數組。

創建完包裹函數后,需要用函數聲明數組的方式,把C功能源代碼中定義的函數與對應的包裹函數一一列舉在數組中,以便Python解釋器能夠導入并調用這些函數,最后的兩個NULL表示函數聲明結束。函數聲明數組代碼及格式說明如圖3所示。

圖3 函數聲明數組的定義及格式說明

第四部分:函數的初始化聲明。

初始化聲明中的代碼,會在包裹模塊被python導入時進行調用,完成初始化C模塊以及這個模塊所包含的函數的作用。初始化聲明代碼如下:

至此,包裹模塊已經全部完成,保存在MaxRunWrapper.c文件中。

3.3 編譯安裝到Python環境,并測試

為了讓Python的擴展能夠被創建,需要把C源代碼、C源代碼頭文件、包裹模塊文件放在一起編譯,放到Python庫,以便在其它Python文件中引入這個C擴展。使用Python中的distutils包來編譯、安裝和分發這些模塊、擴展和包。步驟如下:

(1)創建setup.py

在Python中是由setup函數完成編譯,應為每一個擴展創建一個Extension實例,我們這里只有一個擴展。setup.py文件中的代碼及相關參數說明如圖4所示。

圖4 setup.py文件代碼及相關參數說明

(2)運行setup.py編譯和連接C的擴展代碼

在Ubuntu終端中執行如下命令:python setup.py build。如果最終能生成一個*.so(這里是MaxRun.so)的動態庫文件,表示編譯成功。該文件會被存放在pythonexc/bulid/lib.*目錄下。

(3)從Python中導入模塊和測試

在Ubuntu終端中執行如下命令:sudo python setup.py install。安裝我們的setup.py文件,會把生成的動態庫文件.so復制到Ubuntu的公共庫中,然后就可以用importMaxRun命令導入該擴展模塊的動態庫文件。可以在ipython中以交互的方式測試,也可以新建一個python文件,用import命令導入該擴展模塊,就可以無縫調用C擴展模塊中的函數了。

以新建一個pytest.py文件為例,在其中導入C擴展模塊,并調用其中的test函數、代碼及輸出效果如圖5所示。

圖5 測試文件代碼及輸出結果

4 結束語

在實際應用開發中,以下兩種情況可以考慮用C語言來擴展Python:一是當需要大規模的計算,遇到性能瓶頸的效率提升時;二是需要保持源碼的私密性,如加密解密算法時。在用Python開發項目的時候,如果能夠有效地借力C程序,可以大大提升程序的效率,是現在很多程序員經常采用的編程方式。

猜你喜歡
程序
給Windows添加程序快速切換欄
電腦愛好者(2020年6期)2020-05-26 09:27:33
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
基于VMM的程序行為異常檢測
偵查實驗批準程序初探
我國刑事速裁程序的構建
創衛暗訪程序有待改進
中國衛生(2015年3期)2015-11-19 02:53:32
恐怖犯罪刑事訴訟程序的完善
主站蜘蛛池模板: 91视频免费观看网站| 99精品免费在线| 91网站国产| 狠狠干综合| 特级毛片免费视频| 欧美人与牲动交a欧美精品 | 一级毛片无毒不卡直接观看| 欧美综合区自拍亚洲综合天堂| 国产精品网曝门免费视频| 无码精品国产dvd在线观看9久| 91色在线观看| 亚洲大学生视频在线播放 | 成人第一页| 福利国产微拍广场一区视频在线| 伊人久久婷婷五月综合97色| 亚洲天堂色色人体| 欧洲欧美人成免费全部视频| 精品成人免费自拍视频| 精品三级网站| 亚洲成人免费看| 欧美亚洲综合免费精品高清在线观看| 欧美日韩久久综合| 欧美亚洲国产视频| 国产jizzjizz视频| 日本人真淫视频一区二区三区| 中文字幕人妻av一区二区| 亚洲狠狠婷婷综合久久久久| 国产成人一二三| 国产成人区在线观看视频| 成人伊人色一区二区三区| 日本人妻丰满熟妇区| 深爱婷婷激情网| 国产h视频免费观看| 亚洲综合中文字幕国产精品欧美| 久久国产精品波多野结衣| 午夜限制老子影院888| 在线观看免费黄色网址| 亚洲天堂视频在线观看免费| 免费无遮挡AV| 99精品在线视频观看| 日本一区中文字幕最新在线| 五月天丁香婷婷综合久久| 亚洲视频在线观看免费视频| 国产小视频免费观看| 国产福利拍拍拍| 在线无码私拍| 亚洲有无码中文网| 国产不卡在线看| 91激情视频| 欧美高清三区| 国产在线精品99一区不卡| 亚洲第一精品福利| 欧美日韩综合网| 最新国产成人剧情在线播放| 99精品热视频这里只有精品7| 亚洲国产成人无码AV在线影院L| 91人人妻人人做人人爽男同| 99这里只有精品6| 久久久亚洲色| 欧美国产日产一区二区| 亚洲AV电影不卡在线观看| 精品福利国产| 伊人激情综合网| 亚洲日本一本dvd高清| 国产精品思思热在线| 中文字幕无码制服中字| 被公侵犯人妻少妇一区二区三区| 91无码视频在线观看| 国产特级毛片aaaaaaa高清| 亚洲不卡网| 91最新精品视频发布页| 91视频首页| 在线看片中文字幕| 在线免费看黄的网站| 色AV色 综合网站| 久久频这里精品99香蕉久网址| 自拍亚洲欧美精品| 久久精品最新免费国产成人| 色婷婷亚洲综合五月| 狠狠干欧美| 亚洲精品成人福利在线电影| 色婷婷亚洲综合五月|