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

Вызов кода 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$

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

Решено: LoadLibrary failed with error 87: The parameter is incorrect

Ошибка возникает на компьютерах с видеокартами AMD, может появляться во время запуска вообще разных программ.

Варианты решения:

  • Постоянное решение: Попробовать подобрать версию видеодрайвера, на которой ошибка перестанет появляться
  • Разовое решение:
    • Перед запуском нужной программы войти в «Управление компьютером» — «Диспетчер устройств»
    • Найти видеокарту
    • «Обновить драйвер» — «Найти на этом компьютере» — «Выбрать из списка доступных» — «Базовый видеоадаптер (Microsoft)»
    • Запустить спокойно нужную программу, которая раньше не запускалась
    • После того как нужная программа успешно запустилась, можно так же через диспетчер устройств переключиться обратно на видеодрайвер AMD, при этом программа продолжит нормально работать

Проверено на текстовом редакторе Spyder.

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