在只有cpython的'过去'中,大多数扩展都是用c编写的(尽可能与平台无关)并编译成pyd(例如PyCrypto)。现在有Jython,IronPython和PyPy,并且pyd不能与他们中的任何人合作(Ironclad除外)。它们似乎都支持ctypes,最好的方法是创建一个独立于平台的dll或共享库,然后使用ctypes与它进行交互。
但我认为这种方法会比旧时尚pyd方法慢一点。你也可以为cpython编程一个pyd,为IronPython编写一个类似的c#dll,为Jython编写一个java类或jar(我不确定PyPy。但是这种方法对平台纯粹主义者很有吸引力,但它是非常耗费人力的。所以什么是今天最好的路线?
答案 0 :(得分:2)
目前,似乎ctypes确实是最好的方法。它今天起作用,它很方便,它将征服(大部分)世界。
对于性能关键型API(例如numpy),ctypes确实存在问题。最干净的方法可能是移植Cython以生成本机IronPython / Jython / PyPy扩展。
我记得PyPy计划将ctypes代码编译为高效的包装器,但就我谷歌来说,还没有类似的东西......
答案 1 :(得分:1)
如果要包装现有的本机库,那么ctypes绝对是可行的方法。
如果您正在尝试加速Python扩展中的热点,那么为每个解释器(以及纯Python回退)创建自定义扩展是易处理的,因为大部分代码都是纯Python,可以共享但正如你所说的那样,这是不可取的和劳动密集型的。在这种情况下你也可以使用ctypes。