眾所周知,Python簡單易用,好上手,十分適合各種開發(fā),同時更適合非IT人士進(jìn)行簡單開發(fā),和程序員交流。但是也有起局限性:
缺點(diǎn):
1.代碼不能加密
因?yàn)镻YTHON是解釋性語言,它的源碼都是以明文形式存放的,不過我不認(rèn)為這算是一個缺點(diǎn),如果你的項(xiàng)目要求源代碼必須是加密的,那你一開始就不應(yīng)該用Python來去實(shí)現(xiàn)。
2. 多線程支持不好
3.Python慢
Python相對C語言確實(shí)慢很多,但其實(shí)這里所指的速度慢在大多數(shù)時候我們是無法感知的,比如說,是用C語言程序開發(fā)了一個程序,執(zhí)行需要花0.01秒,使用Python實(shí)現(xiàn)同樣功能的程序,需要花0.1秒
的時間,雖然相差10倍,但是我們基本是感知不到的。更多的時候,程序慢是程序員實(shí)現(xiàn)功能方式導(dǎo)致的。就好像開罐頭的時候,有的人用牙咬,有的人用工具,這樣兩個人的效率相比起來就差了很多。
今天我們就用和大家分享一下Python的C拓展,讓它也可以有C的速度
1. 環(huán)境準(zhǔn)備
如果是Linux只需要安裝Python3.x + Python-dev。
Windows下稍微復(fù)雜點(diǎn),VS2017 + Python3.6.3
VS2017可用社區(qū)版,需要選擇安裝的環(huán)境如下:
2. Hello World !
2.1 C模塊封裝
以計(jì)算兩個數(shù)相加為例,選擇任意文件夾,新建如下C語言源碼:
其中,靜態(tài)函數(shù) calc_add 以python的C接口方式封裝了add函數(shù),命名方式 模塊名_函數(shù)名
靜態(tài)PyMethodDef列表 變量 CalcMethods 包含了該模塊方法的描述
靜態(tài)struct PyModuleDef結(jié)構(gòu)體 變量 calcmodule 定義了模塊的描述
PyInit_calc 函數(shù)初始化了模塊,命名方式 PyInit_模塊名
2.2 C源碼編譯
在VS2017中可以直接生成 .dll 文件,然后改名為 .pyd 就可在python程序中引入該模塊了,但是,這不'清真',正確的姿勢是寫一個 setup.py然后通過python調(diào)cl.exe編譯。
新建 setup.py文件,內(nèi)容如下:
然后,從Windows的命令行(命令提示符)下進(jìn)入到這個文件夾下,執(zhí)行:
python setup.py build
即可完成編譯,如果出現(xiàn)某
.bat
文件未找到,說明你的VS沒有安裝相應(yīng)的依賴(Linux下編譯不成功原因可能是沒有裝python-dev),按文章開頭給出的依賴庫添加修改(此時不需要重新安裝VS)。
編譯結(jié)束后,在該文件夾下會出現(xiàn)build文件夾,進(jìn)入該文件夾,出現(xiàn)如下兩個文件夾:
進(jìn)入lib.xxx那個文件夾,里面有個.pyd結(jié)尾的文件(Linux下為.so結(jié)尾),這就是我們編譯好的python模塊了,如下:
當(dāng)然,你也可以改名為calc.pyd比較好看,不過這不影響調(diào)用。
2.3 Python調(diào)用
這部分就簡單了,進(jìn)入含有編譯好的.pyd文件夾,新建如下文件:
這就是一個普通庫,這樣調(diào)用就OK了。
3. Python的參數(shù)傳遞以及C的返回值相關(guān)問題
這部分我直接甩出文件就行,編譯及調(diào)用過程與上面一樣。
C 文件
如果你選擇了自學(xué),我想給你提幾點(diǎn)建議:
1.找淺顯易懂,例程比較好的教程,從頭到尾看下去。不要看很多本,專注于一本。把里面的例程都手打一遍,搞懂為什
么。
2.去找實(shí)際項(xiàng)目練手。最好是要有真實(shí)的項(xiàng)目做。可以找?guī)讉€同學(xué)一起做個網(wǎng)站之類。注意,真實(shí)項(xiàng)目不一定非要是商業(yè)
項(xiàng)目。
3.最好能找到一個已經(jīng)會python的人。問他一點(diǎn)學(xué)習(xí)規(guī)劃的建議,然后在遇到卡殼的地方找他指點(diǎn)。這樣會事半功倍。
4.另外,除了學(xué)習(xí)編程語言,也兼顧補(bǔ)一點(diǎn)計(jì)算機(jī)基礎(chǔ),和英語。
5.不但要學(xué)寫代碼,還要學(xué)會看代碼,更要會調(diào)試代碼。讀懂你自己程序的報錯信息。再去找些github上的程序,讀懂別
人的代碼。
6.學(xué)會查文檔,用好搜索引擎和開發(fā)者社區(qū)。
就是以上這些,希望你能有所收獲。