在Linux上實現Python調用C語言函數


一般思路

Python中內置ctypes庫,需調用c編譯成的.so文件來實現函數調用。
假設我們所需調用的c文件名為test.c,文件里有我們需要的函數func(x,y).

將.c文件編譯成 .so文件

gcc -fPIC -shared test.c -o test.so

運行后會看到有test.so文件生成。

在Python中導入C文件

在當前目錄下打開Python

import os
from ctypes import *

p = os.getcwd() + '/test.so’ #表示.so文件的絕對路徑,如果你沒在當前路徑打開python則可能需要修改
f = CDLL(p) #讀取.so文件並賦給變量f

這時如果沒報錯,就說明導入該.so文件成功了,可以調用腳本中的函數。

調用函數

# 變量為整數
a = 3
b = 4
f.func(a, b) #該步即運行函數func(x,y)

# 變量為浮點數
c = c_float(5.5)
d = c_float(6.66)
f.func(c, d)

以上便為調用C中函數的簡單形式。

復雜情況

有時,在我們需要的C腳本中,調用了其他的庫,或者也同時調用了以 .h形式被調用的同級別的C腳本。這種情況需要以下步驟:

將所有.c文件編譯為 .o文件

該步驟就按你的需求去編譯生成,但記得加入 -fPIC, 編譯后生成一個或多個.o文件。如果你的C腳本只有一個(即並未調用其他同級別C腳本),當然只有1個.o文件。幾個C腳本生成幾個.o文件。

將所有.o文件編譯為.so文件

gcc -shared -o main.so *.o *-lfftw3 *

上述命令將所有的.o文件編譯為main.so文件,最后的-lfftw3表示C腳本中調用的其他庫,我的是fftw3庫,你需要加你自己調用的庫名字。運行后可生成main.so文件
可用 ldd -r main.so查看.so文件,如果未出現undefined symbol,則編譯應該是正確的。

運行腳本

如果你需要運行腳本而不是只用某個函數,可直接運行該腳本的 main函數

import os
from ctypes import *

p = os.getcwd() + '/test.so’
f = CDLL(p)
f.main() #運行C腳本中的main函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM