У меня есть задача «обернуть» библиотеку ac в класс python. Документы по этому поводу очень расплывчаты. Похоже, они ожидают, что только опытные пользователи Python будут реализовывать ctypes. Что ж, я новичок в Python и мне нужна помощь.
Некоторая пошаговая помощь была бы замечательной.
Итак, у меня есть библиотека c. Что мне делать? Какие файлы куда класть? Как мне импортировать библиотеку? Я читал, что может быть способ «автоматического переноса» на Python?
(Кстати, я сделал учебник ctypes на python.net, и он не работает. Это означает, что я думаю, что они предполагают, что я смогу выполнить остальные шаги.
На самом деле это ошибка, которую я получаю с их кодом:
File "importtest.py", line 1
>>> from ctypes import *
SyntaxError: invalid syntax
Мне действительно нужна пошаговая помощь по этому поводу! Спасибо ~
python
python-3.x
ctypes
потраченный
источник
источник
>>>
в importtest.py? Когда люди публикуют код, который есть>>>
в каждой строке, это означает, что он выполняется в интерактивной оболочке. Чтобы запустить его из файла, удалите>>>
(это 3 знака> и пробел) везде, где он появляется.>>>
s. Они печатаются интерактивной оболочкой и не должны входить в исходный файл.>>>
в файле .py! ОЙ! Никогда раньше такого не видел!Ответы:
Вот краткое и грязное руководство по ctypes.
Сначала напишите свою библиотеку C. Вот простой пример Hello world:
testlib.c
Теперь скомпилируйте его как общую библиотеку ( исправление для Mac можно найти здесь ):
Затем напишите оболочку, используя ctypes:
testlibwrapper.py
Теперь выполните:
И вы должны увидеть результат
Если у вас уже есть библиотека, вы можете пропустить часть учебника, не относящуюся к Python. Убедитесь, что ctypes может найти библиотеку, поместив ее в
/usr/lib
другой стандартный каталог. Если вы это сделаете, вам не нужно указывать полный путь при написании оболочки. Если вы решите не делать этого, вы должны указать полный путь к библиотеке при вызовеctypes.CDLL()
.Здесь не место для более подробного руководства, но если вы попросите помощи с конкретными проблемами на этом сайте, я уверен, что сообщество вам поможет.
PS: Я предполагаю, что вы используете Linux, потому что вы использовали
ctypes.CDLL('libc.so.6')
. Если вы используете другую ОС, все может немного измениться (или довольно сильно).источник
Ответ Чинмая Канчи превосходен, но мне нужен пример функции, которая передает и возвращает переменные / массивы в код C ++. Я хотел бы включить его здесь, если он будет полезен другим.
Передача и возврат целого числа
Код C ++ для функции, которая принимает целое число и добавляет единицу к возвращаемому значению,
Сохраняется как файл
test.cpp
, обратите внимание на обязательный внешний "C" (его можно удалить для кода C). Это скомпилировано с использованием g ++ с аргументами, аналогичными ответу Чинмая Канчи,Кодовый Python использует
load_library
отnumpy.ctypeslib
предполагающего пути к разделяемой библиотеке в том же каталоге, что и сценарий Python,Это напечатает 6, как и ожидалось.
Передача и печать массива
Вы также можете передавать массивы следующим образом, чтобы код C печатал элемент массива,
который компилируется, как и раньше, и импортируется таким же образом. Дополнительный код Python для использования этой функции будет таким:
где мы указываем массив, первый аргумент
print_array
в качестве указателя на массив Numpy выровненных, c_contiguous 64-битных чисел с плавающей запятой, а второй аргумент как целое число, которое сообщает коду C количество элементов в массиве Numpy. Затем это печатается кодом C следующим образом:источник
import numpy as np
. Иначе не удастся найтиnp.float64
и прочее.Во-первых:
>>>
код, который вы видите в примерах Python, - это способ указать, что это код Python. Он используется для отделения кода Python от вывода. Как это:Здесь мы видим, что строка, с которой начинается,
>>>
является кодом Python, а результатом является цифра 9. Именно так это выглядит, если запустить интерпретатор Python, вот почему это делается именно так.Вы никогда не вводите
>>>
деталь в.py
файл.Это позаботится о вашей синтаксической ошибке.
Во-вторых, ctypes - это всего лишь один из нескольких способов обертывания библиотек Python. Другими способами являются SWIG , который просматривает вашу библиотеку Python и генерирует модуль расширения Python C, который предоставляет C API. Другой способ - использовать Cython .
У всех есть свои преимущества и недостатки.
SWIG предоставит Python только C API. Это означает, что вы не получаете никаких объектов или чего-то еще, вам придется создать для этого отдельный файл Python. Однако часто используется модуль с именем say "wowza" и модуль SWIG с именем "_wowza", который является оболочкой для C API. Это приятный и простой способ делать что-то.
Cython генерирует файл C-Extension. Его преимущество заключается в том, что весь код Python, который вы пишете, сделан на C, поэтому объекты, которые вы пишете, также находятся на C, что может улучшить производительность. Но вам нужно будет узнать, как он взаимодействует с C, поэтому вам придется потрудиться, чтобы научиться его использовать.
Преимущество ctypes состоит в том, что для компиляции нет C-кода, поэтому его очень приятно использовать для упаковки стандартных библиотек, написанных кем-то другим, и уже существует в двоичных версиях для Windows и OS X.
источник