Расширения Python, которые можно использовать во всех разновидностях Python (jython / IronPython / и т. Д.) - PullRequest
4 голосов
/ 22 января 2010

В «старые времена», когда был только cpython, большинство расширений были написаны на c (настолько независимыми от платформы, насколько это возможно) и скомпилированы в pyd (например, PyCrypto). Теперь есть Jython, IronPython и PyPy, и pyd не работают ни с одним из них (кроме Ironclad). Кажется, что все они поддерживают ctypes, и наилучший подход МОЖЕТ создать независимую от платформы dll или разделяемую библиотеку, а затем использовать ctypes для взаимодействия с ней.

Но я думаю, что этот подход будет немного медленнее, чем подход старой моды PID. Вы также можете запрограммировать pyd для cpython, аналогичный c # dll для IronPython и java-класс или jar для Jython (я не уверен насчет PyPy. Но хотя этот подход будет привлекательным для пуристов платформы, он очень трудоемок. лучший маршрут сегодня?

Ответы [ 2 ]

2 голосов
/ 22 января 2010

В настоящее время кажется, что ctypes - действительно лучший подход. Он работает сегодня и настолько удобен, что покорит (большую часть) мир.

Для API, критичных к производительности (таких как numpy), ctypes действительно проблематичен. Самый чистый подход, вероятно, заключался бы в портировании Cython для создания собственных расширений IronPython / Jython / PyPy.

Напоминаю, что PyPy планировал скомпилировать код ctypes для эффективных оболочек, но, насколько я знаю, Google пока ничего подобного не имеет ...

1 голос
/ 22 января 2010

Если вы упаковываете существующую нативную библиотеку, ctypes - абсолютно верный путь.

Если вы пытаетесь ускорить «горячие точки» в расширении Python, то создание настраиваемого расширения для каждого интерпретатора (и запасного варианта на чистом Python) поддается изменению, поскольку основная часть кода - это чистый Python, которым можно поделиться , но нежелательно и трудоемко, как вы сказали. В этом случае вы также можете использовать ctypes.

...