python包合集-cffi

2022-08-12 21:04:41

一、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