雙劍合璧,如何用Python調用C代碼

作為一種動態語言,Python的語法靈活,表達強大,因此備受大家青睞,成為目前最受歡迎的語言之一。但是與此同時,靈活的語言特性所帶來的代價是性能的降低。因此,Python在一些計算密集型的場景中,與一些底層語言,如C、C++相比,往往顯得力不從心。那麼,Python有沒有辦法在保持優秀語法特性的同時,還能夠在性能上得到提升呢?當然可以。既然C語言的效率高,那麼我們把程序中對性能要求較高的部分用C語言來實現就是一種解決方案。

雙劍合璧,如何用Python調用C代碼

學習學習代碼和構建的 web 頁面在電腦鍵盤上的 Python 關鍵

在本文中,我們將用C語言實現一個Python模塊,並在Python代碼中對其進行調用。作為例子,這個模塊中將包含兩個簡單的函數:

  • Hello World
  • 斐波那契函數

C文件

首先我們創建一個.c文件,並且加入

#include

其中包含了必要的用C語言實現的Python對象

雙劍合璧,如何用Python調用C代碼

setup.py

接下來,我們利用Python中提供方法將C代碼作為擴展模塊加入到Python模塊中

雙劍合璧,如何用Python調用C代碼

構建模塊並運行

執行:

python setup.py build

python setup.py install

我們會得到類似下面的輸出:

$ python3.6 setup.py build

running build

running build_ext

building 'myModule' extension

/usr/bin/clang -fno-strict-aliasing -Wsign-compare -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -arch i386 -arch x86_64 -g -I/Library/Frameworks/Python.framework/Versions/3.6/include/python3.6m -c test.c -o build/temp.macosx-10.6-intel-3.6/test.o

/usr/bin/clang -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 -g build/temp.macosx-10.6-intel-3.6/test.o -o build/lib.macosx-10.6-intel-3.6/myModule.cpython-36m-darwin.so

$ python3.6 setup.py install

running install

running build

running build_ext

running install_lib

copying build/lib.macosx-10.6-intel-3.6/myModule.cpython-36m-darwin.so -> /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages

running install_egg_info

Removing /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/myModule-1.0-py3.6.egg-info

Writing /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/myModule-1.0-py3.6.egg-info

$ python3.6

Python 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23:13)

[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> import myModule

>>> myModule.helloworld()

Hello World

>>>

在另外一個例子斐波那契函數中,我們將展示如何在C函數中傳遞參數和返回值:

雙劍合璧,如何用Python調用C代碼

經過構建後,就可以調用了:

雙劍合璧,如何用Python調用C代碼

這就是在Python中調用C代碼最基本的用法,希望對大家有用。歡迎大家留言討論。


分享到:


相關文章: