最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python調(diào)用C/C++動(dòng)態(tài)鏈接庫(kù)的方法詳解

 更新時(shí)間:2014年07月22日 10:34:41   投稿:shichen2014  
這篇文章主要介紹了Python調(diào)用C/C++動(dòng)態(tài)鏈接庫(kù)的方法,需要的朋友可以參考下

本文以實(shí)例講解了Python調(diào)用C/C++ DLL動(dòng)態(tài)鏈接庫(kù)的方法,具體示例如下:

示例一:

首先,在創(chuàng)建一個(gè)DLL工程(本例創(chuàng)建環(huán)境為VS 2005),頭文件:

//hello.h
#ifdef EXPORT_HELLO_DLL
#define HELLO_API __declspec(dllexport)
#else
#define HELLO_API __declspec(dllimport)
#endif
extern "C"
{
 HELLO_API int IntAdd(int , int);
}

CPP文件:

//hello.cpp
#define EXPORT_HELLO_DLL
#include "hello.h"
HELLO_API int IntAdd(int a, int b)
{
 return a + b;
}

這里有兩個(gè)注意點(diǎn):

(1)弄清楚編譯的時(shí)候函數(shù)的調(diào)用約定采用的__cdecl還是__stdcall,因?yàn)楦鶕?jù)DLL中函數(shù)調(diào)用約定方式,Python將使用相應(yīng)的函數(shù)加載DLL。

(2)如果采用C++的工程,那么導(dǎo)出的接口需要extern "C",這樣python中才能識(shí)別導(dǎo)出的函數(shù)。

我的工程中采用__cdecl函數(shù)調(diào)用約定方式進(jìn)行編譯鏈接產(chǎn)生hello.dll,然后Python中采用ctypes庫(kù)對(duì)hello.dll進(jìn)行加載和函數(shù)調(diào)用:

from ctypes import *
dll = cdll.LoadLibrary('hello.dll');
ret = dll.IntAdd(2, 4);
print ret;

至此,第一個(gè)小例子已經(jīng)完成了,讀者可以自己動(dòng)手嘗試一下運(yùn)行效果。

示例二:

示例一只是一個(gè)"hello world"級(jí)別的程序,實(shí)際運(yùn)用中更多的需要傳遞數(shù)據(jù)結(jié)構(gòu)、字符串等,才能滿足我們的需求。那么本示例將展示,如何傳遞數(shù)據(jù)結(jié)構(gòu)參數(shù),以及如何通過(guò)數(shù)據(jù)結(jié)構(gòu)獲取返回值。

首先編寫DLL工程中的頭文件:

//hello.h
#ifdef EXPORT_HELLO_DLL
#define HELLO_API __declspec(dllexport)
#else
#define HELLO_API __declspec(dllimport)
#endif

#define ARRAY_NUMBER 20
#define STR_LEN 20

struct StructTest
{
 int number;
 char* pChar;
 char str[STR_LEN];
 int iArray[ARRAY_NUMBER];
};

extern "C"
{
 //HELLO_API int IntAdd(int , int);
 HELLO_API char* GetStructInfo(struct StructTest* pStruct);
}

CPP文件如下:

//hello.cpp
#include <string.h>
#define EXPORT_HELLO_DLL
#include "hello.h"

HELLO_API char* GetStructInfo(struct StructTest* pStruct)
{
 for (int i = 0; i < ARRAY_NUMBER; i++)
 pStruct->iArray[i] = i;
 pStruct->pChar = "hello python!";
 strcpy (pStruct->str, "hello world!");
 pStruct->number = 100;
 return "just OK";
}

GetStructInfo這個(gè)函數(shù)通過(guò)傳遞一個(gè)StructTest類型的指針,然后對(duì)對(duì)象中的屬性進(jìn)行賦值,最后返回"just OK".

編寫Python調(diào)用代碼如下,首先在Python中繼承Structure構(gòu)造一個(gè)和C DLL中一致的數(shù)據(jù)結(jié)構(gòu)StructTest,然后設(shè)置函數(shù)GetStructInfo的參數(shù)類型和返回值類型,最后創(chuàng)建一個(gè)StructTest對(duì)象,并將其轉(zhuǎn)化為指針作為參數(shù),調(diào)用函數(shù)GetStrcutInfo,最后通過(guò)輸出數(shù)據(jù)結(jié)構(gòu)的值來(lái)檢查是否調(diào)用成功

from ctypes import *
ARRAY_NUMBER = 20;
STR_LEN = 20;
#define type
INTARRAY20 = c_int * ARRAY_NUMBER;
CHARARRAY20 = c_char * STR_LEN;
#define struct
class StructTest(Structure):
  _fields_ = [
    ("number", c_int),
    ("pChar", c_char_p),
    ("str", CHARARRAY20),
    ("iArray", INTARRAY20)
        ]
#load dll and get the function object
dll = cdll.LoadLibrary('hello.dll');
GetStructInfo = dll.GetStructInfo;
#set the return type
GetStructInfo.restype = c_char_p;
#set the argtypes
GetStructInfo.argtypes = [POINTER(StructTest)];
objectStruct = StructTest();
#invoke api GetStructInfo
retStr = GetStructInfo(byref(objectStruct));
#check result
print "number: ", objectStruct.number;
print "pChar: ", objectStruct.pChar;
print "str: ", objectStruct.str;
for i,val in enumerate(objectStruct.iArray):
  print 'Array[i]: ', val;
print retStr;

總結(jié):

1. 用64位的Python去加載32位的DLL會(huì)出錯(cuò)
2. 以上只是些測(cè)試程序,在編寫Python過(guò)程中盡可能的使用"try Except"來(lái)處理異常
3. 注意在Python與C DLL交互的時(shí)候字節(jié)對(duì)齊問(wèn)題
4. ctypes庫(kù)的功能還有待繼續(xù)探索

相關(guān)文章

  • Python中順序表的實(shí)現(xiàn)簡(jiǎn)單代碼分享

    Python中順序表的實(shí)現(xiàn)簡(jiǎn)單代碼分享

    這篇文章主要介紹了Python中順序表的實(shí)現(xiàn)簡(jiǎn)單代碼分享,展示了代碼運(yùn)行結(jié)果,然后分享了相關(guān)實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 深入淺出學(xué)習(xí)python裝飾器

    深入淺出學(xué)習(xí)python裝飾器

    這篇文章主要和大家一起深入淺出的學(xué)習(xí)python裝飾器的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Python的functools模塊使用及說(shuō)明

    Python的functools模塊使用及說(shuō)明

    這篇文章主要介紹了Python的functools模塊使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python?islower()函數(shù)的使用詳解

    Python?islower()函數(shù)的使用詳解

    這篇文章主要介紹了Python?islower()函數(shù)使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Python創(chuàng)建二維數(shù)組與初始化的實(shí)踐舉例

    Python創(chuàng)建二維數(shù)組與初始化的實(shí)踐舉例

    二維數(shù)組使用簡(jiǎn)便可以有很多簡(jiǎn)潔的操作,實(shí)現(xiàn)多元的要求,下面這篇文章主要給大家介紹了關(guān)于Python創(chuàng)建二維數(shù)組與初始化的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • TensorFlow人工智能學(xué)習(xí)Keras高層接口應(yīng)用示例

    TensorFlow人工智能學(xué)習(xí)Keras高層接口應(yīng)用示例

    這篇文章主要為大家介紹了TensorFlow人工智能學(xué)習(xí)中Keras高層接口的應(yīng)用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • Python中使用moviepy進(jìn)行視頻分割的實(shí)現(xiàn)方法

    Python中使用moviepy進(jìn)行視頻分割的實(shí)現(xiàn)方法

    MoviePy是一個(gè)關(guān)于視頻編輯的python庫(kù),主要包括:剪輯,嵌入拼接,標(biāo)題插入,視頻合成(又名非線性編輯),視頻處理,和自定制效果。本文重點(diǎn)給大家介紹Python中使用moviepy進(jìn)行視頻分割的實(shí)現(xiàn)方法,需要的朋友一起看看吧
    2021-12-12
  • python簡(jiǎn)單實(shí)現(xiàn)旋轉(zhuǎn)圖片的方法

    python簡(jiǎn)單實(shí)現(xiàn)旋轉(zhuǎn)圖片的方法

    這篇文章主要介紹了python簡(jiǎn)單實(shí)現(xiàn)旋轉(zhuǎn)圖片的方法,涉及Python中image模塊使用技巧,需要的朋友可以參考下
    2015-05-05
  • Python中xml和dict格式轉(zhuǎn)換的示例代碼

    Python中xml和dict格式轉(zhuǎn)換的示例代碼

    最近在做APP的接口,遇到XML格式的請(qǐng)求數(shù)據(jù),費(fèi)了很大勁來(lái)解決,下面小編給大家分享下Python中xml和dict格式轉(zhuǎn)換問(wèn)題,感興趣的朋友跟隨小編一起看看吧
    2019-11-11
  • Python入門教程(十六)Python的if邏輯判斷分支

    Python入門教程(十六)Python的if邏輯判斷分支

    這篇文章主要介紹了Python入門教程(十六)Python的if邏輯判斷分支,Python是一門非常強(qiáng)大好用的語(yǔ)言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下
    2023-04-04

最新評(píng)論

天气| 昌江| 锡林浩特市| 丰顺县| 赤城县| 金阳县| 祁东县| 黔江区| 浮山县| 卓尼县| 义马市| 嘉鱼县| 台南市| 武川县| 榆中县| 金秀| 新昌县| 林芝县| 保靖县| 巴彦淖尔市| 子长县| 松溪县| 宁夏| 祁阳县| 南平市| 织金县| 峨边| 北川| 喜德县| 峨山| 三亚市| 壶关县| 扬中市| 凌海市| 额尔古纳市| 徐闻县| 板桥市| 铜川市| 古田县| 慈溪市| 崇文区|