在 Python 模块中调用 C 头文件函数



我需要将cfgmgr32 api header(cfgmgr.h(从C转换为python模块。这样我就可以从其他 python 脚本调用任何 C 标头函数

ctypes 是 Python 的外部函数库。它提供与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。它可以用来将这些库包装在纯Python中。

您可以使用 ctypes。以下是使用 python:c 示例调用 c、c++、c++ 类的示例:

$ cat mytestlib.c
#include <stdio.h> 
#include <stdlib.h> 
//dmyhaspl.github.io
int subPrint(int a, int b)
{ 
printf("%d - %d  = %d n", a, b,a-b); 
return a-b; 
}
$ gcc -g -o libpycall_c.so -shared -fPIC mytestlib.c
$ python
>>> import ctypes 
>>> lib = ctypes.CDLL("./libpycall_c.so") 
>>> lib.subPrint(12, 34)
12 - 34  = -22 
-22

C++ 示例:

$ cat mytestlib.cpp
#include <iostream>
//dmyhaspl.github.io
using namespace std;
int subPrint_(int a, int b){
int c;
c=a-b;
cout <<a << "-" << b <<"="<< c << endl;
return c;
}
extern "C" {
int subPrint(int a, int b){
return subPrint_(a, b);  
}
}

$ python 
>>> import ctypes 
>>> import ctypes 
>>> lib = ctypes.CDLL("./libpycall.so")   
>>> lib.subPrint(15, 3) 
15-3=12
12
$ g++ -g -o libpycall.so -shared -fPIC -std=c++11 mytestlib.cpp

C++ 类示例:

$ cat mytestlib.cpp
#include <iostream>
//dmyhaspl.github.io
using namespace std;
class AccumulationLib{
private:
int first=0;
int end=0 ;
public:
void setNumber(int first,int end){
this->first=first;
this->end=end;
}
long accumulate(){
long sum=0;
for(int num=first;num<=end;num++){
cout<<num<<" ";
sum+=num;
} 
return sum;
}
int getFirstNumber(){
return first;
}
int getEndNumber(){
return end;
}
}; 
extern "C" {
AccumulationLib obj;
void setNumber(int first,int end){
obj.setNumber(first,end);
}
int getFirstNumber(){
return obj.getFirstNumber();
}
int getEndNumber(){
return obj.getEndNumber();
}
long accumulate(){
return obj.accumulate();
}
}

$ g++ -g -o libpycall.so -shared -fPIC -std=c++11 mytestlib.cpp
$ python
>>> import ctypes
>>> lib = ctypes.CDLL("./libpycall.so")
>>> lib.setNumber(12,32)
43364592
>>> lib.accumulate()
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 462
>>> print lib.accumulate()
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 462
>>> lib.setNumber(12,22)
43364592
>>> print lib.accumulate()
12 13 14 15 16 17 18 19 20 21 22 187

相关内容

  • 没有找到相关文章

最新更新