2010-01-22 5 views
4

Dans l'ancien temps où il n'y avait que cpython, la plupart des extensions étaient écrites en c (aussi indépendantes que possible de la plate-forme) et compilées pyd's (pensez PyCrypto par exemple). Maintenant, il y a Jython, IronPython et PyPy et les pyd ne fonctionnent avec aucun d'entre eux (Ironclad à part). Il semble qu'ils supportent tous les ctypes et que la meilleure approche pourrait être de créer une DLL indépendante de la plate-forme ou une bibliothèque partagée, puis d'utiliser des ctypes pour s'y interfacer.Extensions Python qui peuvent être utilisées dans toutes les variétés de python (jython/IronPython/etc)

Mais je pense que cette approche sera un peu plus lente que l'ancienne approche pyd. Vous pouvez également programmer un pyd pour cpython, un C# dll similaire pour IronPython et une classe java ou un jar pour Jython (je ne suis pas sûr de PyPy.) Bien que cette approche plaira aux puristes de la plateforme, elle demande beaucoup de travail. la meilleure route à prendre aujourd'hui?

Répondre

2

Actuellement, il semble que les ctypes est en effet la meilleure approche. il fonctionne aujourd'hui, et il est si pratique que ça va conquérir (la plupart) dans le monde.

pour critique la performance APIs (comme numpy), ctypes est en effet problématique.L'approche la plus propre serait probablement de port Cython pour produire des extensions natives IronPython/Jython/PyPy

Je rappelle que PyPy avait des plans pour compiler ct le code de ypes pour les wrappers efficaces, mais pour autant que je google, il n'y a rien encore ...

+0

Merci ... c'est ce que je pensais ... marquer votre réponse comme la réponse que vous étiez le premier. – djlawler

1

Si vous encapsulez une bibliothèque native existante, les ctypes est absolument le chemin à parcourir. Si vous essayez d'accélérer les points chauds dans une extension Python, alors faire une extension personnalisée pour chaque interpréteur (et un repli pur-Python) est traitable parce que la majeure partie du code est pur Python qui peut être partagé, mais indésirable et laborieux, comme vous l'avez dit. Vous pouvez également utiliser des ctypes dans ce cas.

+0

Merci ... c'est aussi une excellente réponse. – djlawler

Questions connexes