Вызовите функции файла заголовка 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
Другие вопросы по тегам