Вызовите функции файла заголовка C в модуле Python
Мне нужно преобразовать заголовок API cfgmgr32 (cfgmgr.h) из C в модуль Python. Так что я могу вызвать любые функции заголовка C из другого скрипта Python
1 ответ
ctypes - это библиотека внешних функций для Python. Он предоставляет C-совместимые типы данных и позволяет вызывать функции в DLL или общих библиотеках. Он может быть использован для упаковки этих библиотек в чистый Python.
Вы можете использовать ctypes. Вот примеры вызова классов c, C++, C++ с использованием python:
Пример 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
>>> import ctypes
>>> lib = ctypes.CDLL("./libpycall_c.so")
>>> lib.subPrint(12, 34)
12 - 34 = -22
-22
Пример с ++:
$ 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);
}
}
>>> 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
>>> 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