Использование встроенной библиотеки C в эмуляции Python - PullRequest
4 голосов
/ 02 августа 2011

Короткий вопрос
Что было бы легче эмулировать (в Python) сложный (SAE J1939) стек связи из существующей встроенной библиотеки C:
1) Полный порт - это означает, что нужно вручную преобразовать все функции C в модули Python
2) Обернуть стек в оболочку Python - то есть вызвать реальный код c в Python

Справочная информация
Я уже написал небольшие части этого стека в Python, однако они очень нетривиальны для реализации со 100% охватом. Именно по этой причине мы недавно приобрели готовый стек SAE J1939 для наших встроенных платформ. Чтобы уточнить, я знаю, что части, которые касаются аппаратного уровня, должны быть воссозданы и сопоставлены с драйверами CAN компьютера.

Я надеюсь найти здесь кого-нибудь на SO, который бы смотрел или даже пытался портировать библиотеку 5k LOC C на Python. Если есть какие-нибудь инструменты на C и Python, которые хорошо работают, мне было бы полезно разобраться.

Ответы [ 2 ]

3 голосов
/ 02 августа 2011

Определенно заверните это. Может быть так же просто запустить ctypesgen.py и затем использовать его. Прочтите эту статью блога об использовании ctypesgen для создания оболочки для libreadline http://wavetossed.blogspot.com/2011/07/asynchronous-gnu-readline.html, чтобы получить доступ к полному API.

3 голосов
/ 02 августа 2011

Мой совет - завернуть.

Причины для этого:

  • если вы конвертируете функцию за функцией, вы будете вводить новые ошибки (мы просто люди), и подобные вещи довольно сложно протестировать
  • упаковка для python выполняется легко, используя swig или даже ctypes , чтобы загрузить DLL на лету, вы найдете тонны учебника
  • если ваша библиотека обновляется, вы оказываете меньшее влияние в долгосрочной перспективе.

Однако вам необходимо

  • проверьте, что приобретенная вами лицензия позволяет вам сделать это
  • знаю, что при одинаковой реализации на стороне встраиваемых систем и ПК это не поможет отслеживать ошибки
  • у вас может быть немного меньшая переносимость, чем у полной реализации на Python (в любом случае, для вас не так уж много смысла, поскольку ваш нижний уровень необходимо переписать для каждой цели)
...