gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:09:22 24 4
gpt4 key购买 nike

我需要将 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

关于python - 在Python模块中调用C头文件函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52923822/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com