欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

示例一:

首先,在創(chuàng)建一個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;
}

這里有兩個注意點:

(1)弄清楚編譯的時候函數(shù)的調(diào)用約定采用的__cdecl還是__stdcall,因為根據(jù)DLL中函數(shù)調(diào)用約定方式,Python將使用相應的函數(shù)加載DLL。

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

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

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

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

示例二:

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

首先編寫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這個函數(shù)通過傳遞一個StructTest類型的指針,然后對對象中的屬性進行賦值,最后返回"just OK".

編寫Python調(diào)用代碼如下,首先在Python中繼承Structure構造一個和C DLL中一致的數(shù)據(jù)結構StructTest,然后設置函數(shù)GetStructInfo的參數(shù)類型和返回值類型,最后創(chuàng)建一個StructTest對象,并將其轉化為指針作為參數(shù),調(diào)用函數(shù)GetStrcutInfo,最后通過輸出數(shù)據(jù)結構的值來檢查是否調(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;

總結:

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

相關文章

  • TensorFlow tf.nn.max_pool實現(xiàn)池化操作方式

    TensorFlow tf.nn.max_pool實現(xiàn)池化操作方式

    今天小編就為大家分享一篇TensorFlow tf.nn.max_pool實現(xiàn)池化操作方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python中的常用函數(shù)使用及說明

    Python中的常用函數(shù)使用及說明

    這篇文章主要介紹了Python中的常用函數(shù)使用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python Pandas對缺失值的處理方法

    Python Pandas對缺失值的處理方法

    這篇文章主要給大家介紹了關于Python Pandas對缺失值的處理方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Python Pandas具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • Python字典中items()函數(shù)案例詳解

    Python字典中items()函數(shù)案例詳解

    這篇文章主要介紹了Python字典中items()函數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 520必備!這些Python表白代碼祝你脫單成功

    520必備!這些Python表白代碼祝你脫單成功

    不會還有程序猿沒有女朋友吧?沒關系,今天特地為大家整理了這些Python花式表白代碼,你就放心大膽的去吧,需要的朋友可以參考下
    2021-05-05
  • Django自定義用戶表+自定義admin后臺中的字段實例

    Django自定義用戶表+自定義admin后臺中的字段實例

    今天小編就為大家分享一篇Django自定義用戶表+自定義admin后臺中的字段實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • django創(chuàng)建最簡單HTML頁面跳轉方法

    django創(chuàng)建最簡單HTML頁面跳轉方法

    今天小編就為大家分享一篇django創(chuàng)建最簡單HTML頁面跳轉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python中的getopt函數(shù)使用詳解

    Python中的getopt函數(shù)使用詳解

    這篇文章主要介紹了Python中的getopt函數(shù)使用詳解,是Python進階學習中的重要知識,需要的朋友可以參考下
    2015-07-07
  • Pandas數(shù)據(jù)集的分塊讀取的實現(xiàn)

    Pandas數(shù)據(jù)集的分塊讀取的實現(xiàn)

    本文主要介紹了Pandas數(shù)據(jù)集的分塊讀取的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • python讀取tif圖片時保留其16bit的編碼格式實例

    python讀取tif圖片時保留其16bit的編碼格式實例

    今天小編就為大家分享一篇python讀取tif圖片時保留其16bit的編碼格式實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01

最新評論