Архив метки: ctypes

Вызов кода C++ из скрипта на Python в Linux — самый простой способ

Создаём два текстовых файла main.py и MyClass.cpp

main.py:

from ctypes import cdll
lib = cdll.LoadLibrary('./libmyclass.so')


class MyClass(object):

    def __init__(self):
        self.obj = lib.MyClass_new()

    def my_function(self):
        lib.MyClass_myFunction(self.obj)


m = MyClass()
m.my_function()

MyClass.cpp:

#include <iostream>


class MyClass{
public:
    void myFunction(){
        std::cout << "Hello MyClass!!!" << std::endl;
    }
};


int main()
{
    MyClass m; 
    m.myFunction();  
    return 0;
}


extern "C" {
    MyClass* MyClass_new(){
        return new MyClass();
    }

    void MyClass_myFunction(MyClass* m) {
        m->myFunction();
    }
}

После этого выполняем в консоли следующие команды:

user@computer:~/MyPets/python_cpp_2023-05-01$ ls
main.py  MyClass.cpp
user@computer:~/MyPets/python_cpp_2023-05-01$ g++ -c -fPIC MyClass.cpp -o myclass.o
user@computer:~/MyPets/python_cpp_2023-05-01$ ls
main.py  MyClass.cpp  myclass.o
user@computer:~/MyPets/python_cpp_2023-05-01$ g++ -shared -Wl,-soname,libmyclass.so -o libmyclass.so myclass.o
user@computer:~/MyPets/python_cpp_2023-05-01$ ls
libmyclass.so  main.py  MyClass.cpp  myclass.o
user@computer:~/MyPets/python_cpp_2023-05-01$ python3 main.py 
Hello MyClass!!!
user@computer:~/MyPets/python_cpp_2023-05-01$

Как видим, всё работает. Проще способа не нашёл.

Python ctypes и вызов функций

>>> from ctypes import *
>>> cdll.LoadLibrary("libc.so.6")
<CDLL 'libc.so.6', handle 7f8318993000 at 0x7f8317e7f730>
>>> libc = CDLL("libc.so.6")
>>> libc.printf(b"spam")
4
spam>>> 
>>> c_int()
c_int(0)
>>> c_wchar_p("Hello, World")
c_wchar_p(140201018456432)
>>> c_wchar_p("Hello, World")
c_wchar_p(140201018456688)
>>> c_ushort(-3)
c_ushort(65533)
>>> c_uint(-3)
c_uint(4294967293)
>>> s = "Hello, World"
>>> c_s = c_wchar_p(s)
>>> print(c_s)
c_wchar_p(140201018456432)
>>> print(c_s.value)
Hello, World