真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python和c調(diào)用函數(shù),Python調(diào)用c語言

如何讓python調(diào)用C和C++代碼

二、Python調(diào)用C/C++1、Python調(diào)用C動(dòng)態(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編譯生成動(dòng)態(tài)庫libpycall.so:gcc-olibpycall.so-shared-fPICpycall.c。使用g++編譯生成C動(dòng)態(tài)庫的代碼中的函數(shù)或者方法時(shí),需要使用extern"C"來進(jìn)行編譯。(3)Python調(diào)用動(dòng)態(tài)庫的文件:pycall.py[html]viewplaincopyimportctypesll=ctypes.cdll.LoadLibrarylib=ll("./libpycall.so")lib.foo(1,3)print'***finish***'(4)運(yùn)行結(jié)果:2、Python調(diào)用C++(類)動(dòng)態(tài)鏈接庫需要extern"C"來輔助,也就是說還是只能調(diào)用C函數(shù),不能直接調(diào)用方法,但是能解析C++方法。不是用extern"C",構(gòu)建后的動(dòng)態(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

創(chuàng)新互聯(lián)是專業(yè)的常山網(wǎng)站建設(shè)公司,常山接單;提供網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行常山網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

C語言程序如何調(diào)用python程序

下面是一個(gè)例子:

首先是python的一個(gè)簡單函數(shù)

class Hello:

def __init__(self, x):

self.a = x

def print(self, x=None):

print(x)

def xprint():

print("hello world")

if __name__ == "__main__":

xprint()

h = Hello(5)

h.print()1

下面是C語言

#include python3.4m/Python.h

#include stdio.h

#include stdlib.h

#include string.h

int main()

{

Py_Initialize();

// 將當(dāng)前目錄加入sys.path

PyRun_SimpleString("import sys");

PyRun_SimpleString("sys.path.append('./')");

// 導(dǎo)入hello.py模塊

PyObject *pmodule = PyImport_ImportModule("hello");

// 獲得函數(shù)xprint對象,并調(diào)用,輸出“hello world\n”

PyObject *pfunc = PyObject_GetAttrString(pmodule, "xprint");

PyObject_CallFunction(pfunc, NULL);

// 獲得類Hello并生成實(shí)例pinstance,并調(diào)用print成員函數(shù),輸出“5 6\n”

PyObject *pclass = PyObject_GetAttrString(pmodule, "Hello");

PyObject *arg = Py_BuildValue("(i)", 5);

PyObject *pinstance = PyObject_Call(pclass, arg, NULL);

PyObject_CallMethod(pinstance, "print", "i", 6);

Py_Finalize();

return 0;

}

編譯命令如下:

gcc pyapi.c -lpython3.4m -o pyapi

python 怎么調(diào)用c語言接口

ctypes:? 可直接調(diào)用c語言動(dòng)態(tài)鏈接庫。

使用步驟:

1 編譯好自己的動(dòng)態(tài)連接庫

2 利用ctypes載入動(dòng)態(tài)連接庫

3 用ctype調(diào)用C函數(shù)接口時(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:?編譯動(dòng)態(tài)鏈接庫?(?如何編譯動(dòng)態(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ù)類型,兩個(gè)int(c_int是ctypes類型,見上表)

add.restype?=?c_int?#?返回值類型,int?(c_int?是ctypes類型,見上表)

sum?=?add(3,?6)

Python 外部函數(shù)調(diào)用庫ctypes簡介

一直對不同語言間的交互感興趣,python和C語言又深有淵源,所以對python和c語言交互產(chǎn)生了興趣。

最近了解了python提供的一個(gè)外部函數(shù)庫 ctypes , 它提供了C語言兼容的幾種數(shù)據(jù)類型,并且可以允許調(diào)用C編譯好的庫。

這里是閱讀相關(guān)資料的一個(gè)記錄,內(nèi)容大部分來自 官方文檔 。

ctypes 提供了一些原始的C語言兼容的數(shù)據(jù)類型,參見下表,其中第一列是在ctypes庫中定義的變量類型,第二列是C語言定義的變量類型,第三列是Python語言在不使用ctypes時(shí)定義的變量類型。

創(chuàng)建簡單的ctypes類型如下:

使用 .value 訪問和改變值:

改變指針類型的變量值:

如果需要直接操作內(nèi)存地址的數(shù)據(jù)類型:

下面的例子演示了使用C的數(shù)組和結(jié)構(gòu)體:

創(chuàng)建指針實(shí)例

使用cast()類型轉(zhuǎn)換

類似于C語言定義函數(shù)時(shí),會(huì)先定義返回類型,然后具體實(shí)現(xiàn)再定義,當(dāng)遇到下面這種情況時(shí),也需要這么干:

可以簡單地將"so"和"dll"理解成Linux和windows上動(dòng)態(tài)鏈接庫的指代,這里我們以Linux為例。注意,ctypes提供的接口會(huì)在不同系統(tǒng)上有出入,比如為了加載動(dòng)態(tài)鏈接庫, 在Linux上提供的是 cdll , 而在Windows上提供的是 windll 和 oledll 。

ctypes會(huì)尋找 _as_paramter_ 屬性來用作調(diào)用函數(shù)的參數(shù)傳入,這樣就可以傳入自己定義的類作為參數(shù),示例如下:

用 argtypes 和 restype 來指定調(diào)用的函數(shù)返回類型。

這里我只是列出了 ctypes 最基礎(chǔ)的部分,還有很多細(xì)節(jié)請參考官方文檔。

這兩天文章沒有寫,先是早出晚歸出去玩了一整天,然后加班到凌晨3點(diǎn)左右,一天一篇計(jì)劃劃水得嚴(yán)重啊…

python 字典調(diào)用C++函數(shù)

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

首先,我們用一個(gè)乘法來表示一個(gè)算法功能。下面是C的程序:

int?multiply(int?num1,?int?num2){???

return?num1?*?num2;

}????

如果在Windows下,你可能需要寫成下面這個(gè)樣子:

#include?windows.h?

BOOL?APIENTRYDll

Main(HANDLE?hModule,?DWORD?dwReason,?LPVOID?lpReserved){????

return?TRUE;

}?

__declspec(dllexport)?

intmultiply(int?num1,?int?num2){?

return?num1?*?num2;

}????

然后,自然是把這個(gè)C文件編成動(dòng)態(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腳本中需要把動(dòng)態(tài)鏈接庫放到當(dāng)前目錄中。

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

二、Python調(diào)用C/C++\x0d\x0a\x0d\x0a\x0d\x0a1、Python調(diào)用C動(dòng)態(tài)鏈接庫\x0d\x0a\x0d\x0a Python調(diào)用C庫比較簡單,不經(jīng)過任何封裝打包成so,再使用python的ctypes調(diào)用即可。\x0d\x0a(1)C語言文件: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)庫libpycall.so:gcc -o libpycall.so -shared -fPIC pycall.c。使用g++編譯生成C動(dòng)態(tài)庫的代碼中的函數(shù)或者方法時(shí),需要使用extern "C"來進(jìn)行編譯。\x0d\x0a(3)Python調(diào)用動(dòng)態(tài)庫的文件: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)鏈接庫 \x0d\x0a\x0d\x0a 需要extern "C"來輔助,也就是說還是只能調(diào)用C函數(shù),不能直接調(diào)用方法,但是能解析C++方法。不是用extern "C",構(gòu)建后的動(dòng)態(tài)鏈接庫沒有這些函數(shù)的符號表。\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


分享文章:python和c調(diào)用函數(shù),Python調(diào)用c語言
文章起源:http://weahome.cn/article/dsejepg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部