python調(diào)用c的函數(shù) python調(diào)用c函數(shù)如何傳數(shù)組參數(shù)

python 調(diào)用c函數(shù)里面的函數(shù)嗎

若你是想調(diào)用 c 編寫(xiě)的DLL,可以使用ctypes調(diào)入使用;

成都創(chuàng)新互聯(lián)專注于奎屯企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站建設(shè)??途W(wǎng)站建設(shè)公司,為奎屯等地區(qū)提供建站服務(wù)。全流程按需定制網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

#!/usr/bin/python

from?ctypes?import?*

import?os?

#需要使用絕對(duì)路徑

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使用ctypes調(diào)用C編譯dll函數(shù)方法

在函數(shù)聲明加入前綴,如

__declspec(dllexport) int Fun(int a, int b)

否則在加載該dll時(shí)會(huì)提示找不到該符號(hào)

在windows下可以通過(guò)vs自帶的dumpbin工具查看可被調(diào)用符號(hào)

dumpbin /exports test.dll

C函數(shù)在調(diào)用過(guò)程中關(guān)于參數(shù)傳遞和壓棧由多種規(guī)定,作為dll提供給其他程序調(diào)用時(shí),必須明確并統(tǒng)一為同一種調(diào)用規(guī)定,否則會(huì)導(dǎo)致棧破壞,編譯器負(fù)責(zé)具體實(shí)現(xiàn)調(diào)用規(guī)定,主要有以下幾種調(diào)用規(guī)定

python下調(diào)用C庫(kù)有多種方式,ctypes是其中一種比較方便的,調(diào)用時(shí)首先需要加載dll文件,根據(jù)C dll的調(diào)用規(guī)定不同需要使用不同接口,使用ctypes需要 import ctypes 庫(kù)

對(duì)于簡(jiǎn)單的C函數(shù),例如 int add(int a, int b) , 此時(shí)就可以直接調(diào)用了,如

對(duì)于較復(fù)雜的C函數(shù)的參數(shù)情況,ctypes調(diào)用時(shí)對(duì)入?yún)⒑统霾妥鲆欢ㄌ幚?,這里分情況討論

以上包含了幾種主要的參數(shù)傳遞情況,ctypes也提供了一個(gè)較為完整的python類型和C類型的對(duì)照,如下:

怎樣讓Python腳本與C++程序互相調(diào)用

二、Python調(diào)用C/C++\x0d\x0a\x0d\x0a\x0d\x0a1、Python調(diào)用C動(dòng)態(tài)鏈接庫(kù)\x0d\x0a\x0d\x0a Python調(diào)用C庫(kù)比較簡(jiǎn)單,不經(jīng)過(guò)任何封裝打包成so,再使用python的ctypes調(diào)用即可。\x0d\x0a(1)C語(yǔ)言文件:pycall.c\x0d\x0a\x0d\x0a[html] view plain copy \x0d\x0a/***gcc -o libpycall.so -shared -fPIC pycall.c*/ \x0d\x0a#include \x0d\x0a#include \x0d\x0aint foo(int a, int b) \x0d\x0a{ \x0d\x0a printf("you input %d and %d\n", a, b); \x0d\x0a return a+b; \x0d\x0a} \x0d\x0a(2)gcc編譯生成動(dòng)態(tài)庫(kù)libpycall.so:gcc -o libpycall.so -shared -fPIC pycall.c。使用g++編譯生成C動(dòng)態(tài)庫(kù)的代碼中的函數(shù)或者方法時(shí),需要使用extern "C"來(lái)進(jìn)行編譯。\x0d\x0a(3)Python調(diào)用動(dòng)態(tài)庫(kù)的文件:pycall.py\x0d\x0a\x0d\x0a[html] view plain copy \x0d\x0aimport ctypes \x0d\x0all = ctypes.cdll.LoadLibrary \x0d\x0alib = ll("./libpycall.so") \x0d\x0alib.foo(1, 3) \x0d\x0aprint '***finish***' \x0d\x0a(4)運(yùn)行結(jié)果:\x0d\x0a\x0d\x0a\x0d\x0a2、Python調(diào)用C++(類)動(dòng)態(tài)鏈接庫(kù) \x0d\x0a\x0d\x0a 需要extern "C"來(lái)輔助,也就是說(shuō)還是只能調(diào)用C函數(shù),不能直接調(diào)用方法,但是能解析C++方法。不是用extern "C",構(gòu)建后的動(dòng)態(tài)鏈接庫(kù)沒(méi)有這些函數(shù)的符號(hào)表。\x0d\x0a(1)C++類文件:pycallclass.cpp\x0d\x0a\x0d\x0a[html] view plain copy \x0d\x0a#include \x0d\x0ausing namespace std; \x0d\x0a \x0d\x0aclass TestLib \x0d\x0a{ \x0d\x0a public: \x0d\x0a void display(); \x0d\x0a void display(int a); \x0d\x0a}; \x0d\x0avoid TestLib::display() { \x0d\x0a cout \x0d\x0ausing namespace std; \x0d\x0aint test() \x0d\x0a{ \x0d\x0a int a = 10, b = 5; \x0d\x0a return a+b; \x0d\x0a} \x0d\x0aint main() \x0d\x0a{ \x0d\x0a cout \x0d\x0a#include \x0d\x0a#include \x0d\x0a \x0d\x0aint fac(int n) \x0d\x0a{ \x0d\x0a if (n

回答于?2022-11-16

網(wǎng)站標(biāo)題:python調(diào)用c的函數(shù) python調(diào)用c函數(shù)如何傳數(shù)組參數(shù)
文章源于:http://muchs.cn/article30/doeoopo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)微信公眾號(hào)、標(biāo)簽優(yōu)化外貿(mào)建站、網(wǎng)站建設(shè)、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站