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
恐怖犯罪刑事訴訟程序的完善
主站蜘蛛池模板: 亚洲欧洲一区二区三区| 国产精品短篇二区| 欧美黄色a| 国产人人乐人人爱| a毛片在线免费观看| 亚洲日本一本dvd高清| 91精品久久久久久无码人妻| 亚洲欧美一级一级a| 热久久国产| 999国产精品永久免费视频精品久久| 鲁鲁鲁爽爽爽在线视频观看| 天堂av综合网| 午夜少妇精品视频小电影| 亚洲最大看欧美片网站地址| 亚洲IV视频免费在线光看| 18禁影院亚洲专区| 亚洲一区二区成人| 欧美亚洲第一页| 亚洲中文久久精品无玛| 国产毛片基地| 色综合中文综合网| 国产无吗一区二区三区在线欢| 在线观看国产精品第一区免费| 国产三级成人| 午夜啪啪网| 四虎影视无码永久免费观看| 四虎成人免费毛片| 国产精品私拍在线爆乳| 亚洲v日韩v欧美在线观看| 九九九久久国产精品| 国产一区二区精品高清在线观看| 久久夜色精品国产嚕嚕亚洲av| www.狠狠| 四虎国产在线观看| 中文字幕免费在线视频| 日韩专区第一页| 国产精品久久久久久影院| 日韩毛片免费视频| 熟妇丰满人妻av无码区| 国产精品美人久久久久久AV| 国产精品妖精视频| 国产成人a在线观看视频| 69精品在线观看| 精品人妻系列无码专区久久| 亚洲一道AV无码午夜福利| 男女男免费视频网站国产| 国产精品刺激对白在线| 国内a级毛片| 露脸一二三区国语对白| 毛片在线播放a| 亚洲中文字幕无码mv| a级毛片毛片免费观看久潮| 亚洲成网777777国产精品| 98精品全国免费观看视频| 免费99精品国产自在现线| 一边摸一边做爽的视频17国产| 99人妻碰碰碰久久久久禁片| 日韩毛片基地| 九九免费观看全部免费视频| 日韩二区三区无| 蜜臀AVWWW国产天堂| 国产91丝袜| 亚洲综合精品香蕉久久网| 91午夜福利在线观看| 在线国产欧美| 成人福利在线视频免费观看| 久久亚洲中文字幕精品一区| 91久久天天躁狠狠躁夜夜| 欧美在线综合视频| 69综合网| 亚洲人成人无码www| 欧美www在线观看| 亚洲va视频| 国产成人精品免费视频大全五级 | 日本午夜精品一本在线观看| 中文无码日韩精品| 亚洲无码37.| 国产丝袜啪啪| 国产福利在线观看精品| 亚洲无码37.| 国产一级毛片在线| 性喷潮久久久久久久久|