一、cffi
cffi是連接Python與c的橋梁,可實作在Python中呼叫c檔案,cffi為c語言的外部介面,在Python中使用該介面可以實作在Python中使用外部c檔案的資料結構及函式,
二、直接在python中通過cffi定義c函式并使用
1、先通過pip3安裝cffi : pip3 install cffi
2、撰寫測驗代碼:直接在 python 檔案中 撰寫并執行 C語言代碼
# test1.py 檔案中
# 從cffi模塊匯入FFI from cffi import FFI # 創建FFI物件 ffi = FFI() # 使用cdef創建C語言的函式宣告,類似于頭檔案 ffi.cdef("int add(int a, int b);") ffi.cdef("int sub(int a, int b);") #verify是在線api模式的基本方法它里面直接寫C代碼即可 lib = ffi.verify(""" int add(int a, int b) { return a+b; } int sub(int a,int b) { return a-b; } """) print(lib.add(1, 2)) print(lib.sub(1, 2))
3、執行結果
root@ubuntu:~/test_cffi# python3 test1.py 3 -1
三、加載已有C語言代碼并執行
1、創建 test2.c 檔案,并寫如下代碼,注意這是一個 .c 的檔案
#include <stdio.h> // 函式宣告 int add(int a, int b); // 函式定義 int add(int a, int b) { return a+b; } int mul(int a,int b); int mul(int a,int b) { return a*b; }
2、創建 test3.py 檔案,并在 test3.py 中呼叫 test2.c 檔案
from cffi import FFI ffi = FFI() # 就算在C語言的檔案中定義了,這里在時候前還是需要宣告一下 ffi.cdef(""" int add(int a, int b); int mul(int a,int b); """) #verify是在線api模式的基本方法它里面直接寫C代碼即可 lib = ffi.verify(sources=['test2.c']) print(lib.add(1,2)) print(lib.mul(1,2))
3、運行結果
root@ubuntu:~/test_cffi# python3 test3.py 3 2
四、打包C語言檔案為擴展模塊提供給其他 python 程式使用
1、創建 test4.py 檔案,其內容如下
import cffi ffi = cffi.FFI() #生成cffi實體 ffi.cdef("""int add(int a, int b);""") #函式宣告 ffi.cdef("""int sub(int a, int b);""") # 引數1:為這個C語言的實作模塊起個名字,類似于,這一塊C語言代碼好像寫在一個檔案中,而這就是這個檔案的名字,既擴展模塊名 # 引數2:為具體的函式實作部分 ffi.set_source('test4_cffi', """ int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } """) if __name__ == '__main__': ffi.compile(verbose=True)
2、 執行: python3 test4.py 執行程序如下
root@ubuntu:~/test_cffi# python3 test4.py generating ./test4_cffi.c the current directory is '/root/test_cffi' running build_ext building 'test4_cffi' extension x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.5m -c test4_cffi.c -o ./test4_cffi.o x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 ./test4_cffi.o -o ./test4_cffi.cpython-35m-x86_64-linux-gnu.so root@ubuntu:~/test_cffi#
3、執行后多三個檔案,分別是 .c, .o , .so 結尾的檔案
- test4_cffi.c
- test4_cffi.cpython-35m-x86_64-linux-gnu.so
- test4_cffi.o
4、撰寫 test5.py, 在 test5.py 中使用test4_cffi 擴展模塊,如下
from test4_cffi import ffi, lib print(lib.add(20, 3)) print(lib.sub(10, 3))
5、運行結果如下
root@ubuntu:~/test_cffi# python3 test5.py 23 7
侯哥語錄:我曾經是一個職業教育者,現在是一個自由開發者,我希望我的分享可以和更多人一起進步,分享一段我喜歡的話給大家:"我所理解的自由不是想干什么就干什么,而是想不干什么就不干什么,當你還沒有能力說不得時候,就努力讓自己變得強大,擁有說不得權利,"
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/501697.html
標籤:其他
