新聞中心
python 字典調(diào)用C++函數(shù)
使用Python的ctypes,我們可以直接調(diào)用由C直接編譯出來的函數(shù)。其實就是調(diào)用動態(tài)鏈接庫中的函數(shù)。為什么我們需要這樣做呢,因為有些時候,我們可能需要一個性能上比較講究的算法,有些時候,我們可以在Python中使用已經(jīng)有了的現(xiàn)成的被封閉在動態(tài)鏈接庫中的函數(shù)。下面是如何調(diào)用的示例。

創(chuàng)新互聯(lián)響應(yīng)式網(wǎng)站特點就是不管在電腦、平板還是手機上,H5技術(shù)都會根據(jù)屏幕尺寸自動調(diào)節(jié)大小、圖片分辨率,并且融入一定的動畫特效,讓網(wǎng)站看起來非常的美觀大方。從網(wǎng)站需求對接到網(wǎng)站制作設(shè)計、從代碼編寫到項目上線運維,技術(shù)人員全程跟蹤,快速響應(yīng)
首先,我們用一個乘法來表示一個算法功能。下面是C的程序:
int?multiply(int?num1,?int?num2){???
return?num1?*?num2;
}????
如果在Windows下,你可能需要寫成下面這個樣子:
#include?windows.h?
BOOL?APIENTRYDll
Main(HANDLE?hModule,?DWORD?dwReason,?LPVOID?lpReserved){????
return?TRUE;
}?
__declspec(dllexport)?
intmultiply(int?num1,?int?num2){?
return?num1?*?num2;
}????
然后,自然是把這個C文件編成動態(tài)鏈接庫:
Linux下的編譯:
gcc?-c?-fPIC?libtest.c
gcc?-shared?libtest.o?-o?libtest.so????
Windows下的編譯:
cl?-LD?libtest.c?-libtest.dll????
于是在我們的Python中可以這樣使用:
(其中的libtest.so在Windows下改成libtest.dll即可)
from?ctypes?import?*
import?os
libtest?=?cdll.LoadLibrary(os.getcwd()?+?'/libtest.so')
print?libtest.multiply(2,?2)4????
注意:上面的Python腳本中需要把動態(tài)鏈接庫放到當前目錄中。
python 怎么調(diào)用c語言接口
ctypes:? 可直接調(diào)用c語言動態(tài)鏈接庫。
使用步驟:
1 編譯好自己的動態(tài)連接庫
2 利用ctypes載入動態(tài)連接庫
3 用ctype調(diào)用C函數(shù)接口時,需要將python變量類型做轉(zhuǎn)換后才能作為函數(shù)參數(shù),轉(zhuǎn)換原則見下圖:
4 Python若想獲取ctypes調(diào)用的C函數(shù)返回值,需要先指定返回值類型。我們將在接下來的完整Sample中看到如何使用。
#Step?1:??test.c#include?stdio.h
int?add(int?a,?int?b)
{
return?a?+?b;
}#Step?2:?編譯動態(tài)鏈接庫?(?如何編譯動態(tài)鏈接庫在本文不詳解,網(wǎng)上資料一大堆。)gcc?-fPIC?-shared?test.c?-o?libtest.so??
#Step?3:??test.py
from?ctypes?import?*mylib?=?CDLL("libtest.so")???或者???cdll.LoadLibrary("libtest.so")???add?=?mylib.add
add.argtypes?=?[c_int,?c_int]?#?參數(shù)類型,兩個int(c_int是ctypes類型,見上表)
add.restype?=?c_int?#?返回值類型,int?(c_int?是ctypes類型,見上表)
sum?=?add(3,?6)
如何讓python調(diào)用C和C++代碼
二、Python調(diào)用C/C++1、Python調(diào)用C動態(tài)鏈接庫Python調(diào)用C庫比較簡單,不經(jīng)過任何封裝打包成so,再使用python的ctypes調(diào)用即可。(1)C語言文件:pycall.c[html]viewplaincopy/***gcc-olibpycall.so-shared-fPICpycall.c*/#include#includeintfoo(inta,intb){printf("youinput%dand%d\n",a,b);returna+b;}(2)gcc編譯生成動態(tài)庫libpycall.so:gcc-olibpycall.so-shared-fPICpycall.c。使用g++編譯生成C動態(tài)庫的代碼中的函數(shù)或者方法時,需要使用extern"C"來進行編譯。(3)Python調(diào)用動態(tài)庫的文件:pycall.py[html]viewplaincopyimportctypesll=ctypes.cdll.LoadLibrarylib=ll("./libpycall.so")lib.foo(1,3)print'***finish***'(4)運行結(jié)果:2、Python調(diào)用C++(類)動態(tài)鏈接庫需要extern"C"來輔助,也就是說還是只能調(diào)用C函數(shù),不能直接調(diào)用方法,但是能解析C++方法。不是用extern"C",構(gòu)建后的動態(tài)鏈接庫沒有這些函數(shù)的符號表。(1)C++類文件:pycallclass.cpp[html]viewplaincopy#includeusingnamespacestd;classTestLib{public:voiddisplay();voiddisplay(inta);};voidTestLib::display(){cout#include#includeintfac(intn){if(n2)return(1);/*0!==1!==1*/return(n)*fac(n-1);/*n!==n*(n-1)!*/}char*reverse(char*s){registerchart,/*tmp*/*p=s,/*fwd*/*q=(s+(strlen(s)-1));/*bwd*/while(p
python使用ctypes調(diào)用C編譯dll函數(shù)方法
在函數(shù)聲明加入前綴,如
__declspec(dllexport) int Fun(int a, int b)
否則在加載該dll時會提示找不到該符號
在windows下可以通過vs自帶的dumpbin工具查看可被調(diào)用符號
dumpbin /exports test.dll
C函數(shù)在調(diào)用過程中關(guān)于參數(shù)傳遞和壓棧由多種規(guī)定,作為dll提供給其他程序調(diào)用時,必須明確并統(tǒng)一為同一種調(diào)用規(guī)定,否則會導(dǎo)致棧破壞,編譯器負責具體實現(xiàn)調(diào)用規(guī)定,主要有以下幾種調(diào)用規(guī)定
python下調(diào)用C庫有多種方式,ctypes是其中一種比較方便的,調(diào)用時首先需要加載dll文件,根據(jù)C dll的調(diào)用規(guī)定不同需要使用不同接口,使用ctypes需要 import ctypes 庫
對于簡單的C函數(shù),例如 int add(int a, int b) , 此時就可以直接調(diào)用了,如
對于較復(fù)雜的C函數(shù)的參數(shù)情況,ctypes調(diào)用時對入?yún)⒑统霾妥鲆欢ㄌ幚恚@里分情況討論
以上包含了幾種主要的參數(shù)傳遞情況,ctypes也提供了一個較為完整的python類型和C類型的對照,如下:
python 調(diào)用c函數(shù)里面的函數(shù)嗎
若你是想調(diào)用 c 編寫的DLL,可以使用ctypes調(diào)入使用;
#!/usr/bin/python
from?ctypes?import?*
import?os?
#需要使用絕對路徑
extest?=?cdll.LoadLibrary(os.getcwd()?+?'/DemoC.so')
或在windows下
#!/usr/bin/python
import?ctypes
import?os?
if?os.name?==?'nt':?#?windows系統(tǒng)
_lib_name?=?os.getcwd()?+?'/DemoC.DLL'
dl200_lib?=?ctypes.WinDLL(dl200_lib_name)
分享標題:python中調(diào)用c函數(shù),c++中調(diào)用python
路徑分享:http://www.dlmjj.cn/article/heseos.html


咨詢
建站咨詢
