Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 12

Тема: Как использовать ctype в Python 3 для вызова C-функций?

  1. Как использовать ctype в Python 3 для вызова C-функций?

    Привет, ребзя! У меня вопрос. Я тут балуюсь с ctype в Python 3, пытаясь вызвать функции из C-библиотеки. Кто-нибудь делал подобное? Какие-то фишки, грабли или советы можете дать? Например, как работать с указателями или массивами в C и передавать их в Python? Буду рад примерам и объяснениям. Спасибо!



  2. Ждём вас в нашем чате в Телеграмм ==>> @pythoneer_chat

    А ТАКЖЕ: Канал о Python, статьи и книги ==>>
    @pythoneer_ru

  3. Йо, бро! Итак, чтобы юзать ctypes, сначала нужно заимпортить эту библиотеку. Вот пример простого вызова функции из C:

    Программный код:
    #include <stdio.h>
      
    void hello() {
        
    printf("Hello from C!
    "
    );

    А теперь на питоне:

    Программный код:
    from ctypes import CDLL
      
    mylib 
    CDLL('./mylib.so')
    mylib.hello() 
    Так можно загрузить свою библиотеку и вызвать функцию. Обрати внимание на работу с путями.

  4. Цитата Сообщение от TanyaMoon
    Йо, бро! Итак, чтобы юзать ctypes, сначала нужно заимпортить эту библиотеку. Вот пример простого вызова функции из C:

    Программный код:
    #include <stdio.h>
      
    void hello() {
        
    printf("Hello from C!
    "
    );

    А теперь на питоне:

    Программный код:
    from ctypes import CDLL
      
    mylib 
    CDLL('./mylib.so')
    mylib.hello() 
    Так можно загрузить свою библиотеку и вызвать функцию. Обрати внимание на работу с путями.
    Кросс, примеры на обе стороны — это всегда полезно! Но ты путь до .so файла забыл указать. В остальном норм.

  5. Здорово! Работал с указателями в ctypes. Нужно использовать POINTER тип. Вот пример для передачи массива:

    Программный код:
    from ctypes import CDLLPOINTERc_int
      
    array_type 
    c_int 5
    myarray 
    array_type(12345)
    mylib CDLL('./mylib.so')
    mylib.process_array.argtypes = [POINTER(c_int)]
    mylib.process_array(myarray
    Понятно?

  6. Цитата Сообщение от Михаил Павлович
    Здорово! Работал с указателями в ctypes. Нужно использовать POINTER тип. Вот пример для передачи массива:

    Программный код:
    from ctypes import CDLLPOINTERc_int
      
    array_type 
    c_int 5
    myarray 
    array_type(12345)
    mylib CDLL('./mylib.so')
    mylib.process_array.argtypes = [POINTER(c_int)]
    mylib.process_array(myarray
    Понятно?
    Да, понял. Зачем c_int * 5, если можно было просто [1, 2, 3, 4, 5]? Или я чёт не допонял?

  7. Я тут на днях тоже ковырялся. Иногда проблемки возникают с типами. Например, c_double можно юзать для float:

    Программный код:
    from ctypes import c_double
      
    val 
    c_double(3.14
    И не забывай про винды — там свои приколы с DLL-ками.

  8. Цитата Сообщение от Диана
    Я тут на днях тоже ковырялся. Иногда проблемки возникают с типами. Например, c_double можно юзать для float:

    Программный код:
    from ctypes import c_double
      
    val 
    c_double(3.14
    И не забывай про винды — там свои приколы с DLL-ками.
    Муть с этими типами! А если у меня в C int, в питоне _int_c использовать норм?

  9. Если нужно работать с C-структурами, ctypes поможет. Можно намутить так:

    Программный код:
    from ctypes import Structurec_intc_double
      
    class Point(Structure):
        
    _fields_ = [("x"c_double), ("y"c_double)]
      
    def create_point(xy):
        return 
    Point(xy)
      
    point create_point(1.02.0
    И это только начало. Зависит от структуры, но ctypes мощный.

  10. Цитата Сообщение от Елизавета
    Если нужно работать с C-структурами, ctypes поможет. Можно намутить так:

    Программный код:
    from ctypes import Structurec_intc_double
      
    class Point(Structure):
        
    _fields_ = [("x"c_double), ("y"c_double)]
      
    def create_point(xy):
        return 
    Point(xy)
      
    point create_point(1.02.0
    И это только начало. Зависит от структуры, но ctypes мощный.
    И правда мощь! А методы на структуру как навесить?

Страница 1 из 2 12 ПоследняяПоследняя