Обработка объектов из библиотеки C в коде python - PullRequest
1 голос
/ 23 апреля 2020

Я хотел бы внедрить библиотеку C / C ++ из файла .dll в сценарий Python для управления частью оборудования ввода / вывода, которое называется ClipX от HBM (на случай, если кто-нибудь в будущем потребуется помощь).

Производитель приводит пример реализации C и пример реализации C ++. В примере C функция Connect () возвращает некоторый указатель, который используется в последующих функциях чтения / записи. В примере C ++ класс ClipX используется для установления sh соединения, а функции чтения / записи являются методами в этом классе. Я упростил код для целей этого вопроса.

По сути, я хочу connect() для устройства, а в более поздний момент read() от него. Из того, что я прочитал, кажется, что Cython будет хорошим способом обернуть connect() и read() в отдельные функции и импортировать их как модуль в Python. Мои вопросы:

  1. Для реализации C смогу ли я передать указатель MHandle обратно в Python после подключения для последующего использования (т.е. вызова функции чтения) ? Будет ли указатель вообще иметь какое-либо значение, будучи использованным позже в другом вызове функции?

  2. Для реализации C ++, может ли объект dev быть передан в код Python, чтобы быть позже назад за Read()? Вы можете сделать это с произвольными объектами?

Я инженер-механик, извините, если это гиббери sh или дико неинформирован. Любое руководство очень ценится.

C Код:

/*From .h file*/
----------------------------------------------------
struct sClipX {
void *obj;
};

typedef struct sClipX * MHandle;
ClipX_API MHandle __stdcall Connect(const char *);
----------------------------------------------------
/*End .h file*/

int main()
{
    const char * IP = "172.21.104.76";
    MHandle m=Connect(IP);
    Read(m, 0x4428);
}

C ++ Код:

int main(){
    ClipX  dev = ClipX();
    dev.Connect("172.21.104.76");
    dev.Read(0x4428);

1 Ответ

1 голос
/ 23 апреля 2020

C ++ функции могут вызываться из C, если вы объявите их как extern "C". Это связано с искажением имени

Интерпретатор Python может быть расширен функциями C. Внимательно прочитайте главу Расширение и встраивание Python Интерпретатор .

Будьте осторожны с исключениями C ++. Вы не хотите, чтобы они пересекали код интерпретатора Python. Поэтому любая функция extern "C" C ++, вызываемая из Python, должна обрабатывать и перехватывать исключения , вызванные внутренними процедурами.

Наконец, будьте осторожны с управлением памятью и сборкой мусора. Старая статья П. Уилсона о Унифицированные методы сбора мусора актуальна, по крайней мере, для терминологии и понимания. Или прочитайте G C справочник . Python использует схему подсчета ссылок и обрабатывает специально слабые ссылки . Будьте осторожны с циклическими ссылками .

Разумеется, помните о GIL в Python. Грубо говоря, вы не можете иметь несколько потоков, выполняющих Python вещи без предосторожностей.

Сериализация данных, связанных с устройством, также может быть проблемой, но она, вероятно, вам не нужна.

Самое главное, хорошо документируйте ваш код .

Могут помочь такие инструменты, как doxygen (возможно, с LaTeX или DocBook ).

Используйте, конечно, достаточно хорошую систему контроля версий . Я рекомендую git. Также хороший инструмент для автоматизации сборки .

Я предлагаю опубликовать sh ваш код C ++ как с открытым исходным кодом , например, на github или gitlab . Затем вы можете получить полезные обзоры кодов и отзывы.

Если ваша аппаратная и программная система критически важна для безопасности , рассмотрите stati c программный анализ техники, например с Frama- C или Clang stati c анализатор или с вашим собственным G CC плагином . Через несколько месяцев (конец 2020 года) вы можете попробовать Bismon (см. Также этот черновик отчет).

Я определенно пристрастен, но я рекомендую попробовать некоторые Linux дистрибутив (например, Ubuntu или Debian ) в качестве платформы кросс-разработки. Имейте в виду, что многие устройства (включая RaspBerryPi ) работают под управлением встроенной Linux системы , поэтому усилия по обучению имеют смысл. Затем прочитайте Дополнительно Linux Программирование

...