我对python绑定有疑问。
我有一个命令行,它公开了一些功能,并重新考虑了代码以通过共享库提供功能。我想知道从“为共享库编写python绑定”与“直接调用命令行”得到的真正优势。
我认为一个明显的优势是性能,共享库将链接到同一个进程,并且可以在同一进程中调用该功能。它将避免通过命令行生成新进程。
我可以通过为这种情况编写python绑定来获得任何其他优势吗?
感谢。
答案 0 :(得分:3)
我很难想象一个人宁愿包装库的命令行界面而不是包装库本身的情况。 (除非有一个带有简洁命令行界面的库,而在内部完全混乱;但OP表示通过命令行提供的相同功能在库函数调用方面很容易访问)。
编写Python绑定的最大优点是库和Python之间明确定义的数据接口。理想情况下,库可以直接在Python管理的内存上运行,而不涉及任何数据复制。
为了说明这一点,我们假设库函数执行比打印当前时间更复杂的事情,即,它获得大量数据作为输入,执行某些操作,并返回大量数据作为输出。如果输入数据是一个输入文件,Python需要先生成这个文件。它必须确保操作系统在通过命令行调用库之前完成了文件的编写(我已经看到了几个C库,其中sleep(1)
调用被用作此问题的创可贴...)。 Python必须以某种方式恢复输出。
如果命令行界面不依赖于文件但获取命令行上的所有参数并在stdout
上打印输出,则Python可能需要在二进制数据和字符串格式之间进行转换,而不是始终使用预期的结果。它还需要管道stdout
并解析它。没问题,但要做到这一切都是很多工作。
错误处理怎么样?那么,命令行界面可能会通过在stderr
上打印错误消息来处理错误。所以Python也需要捕获,解析和处理它们。 OTOH,相应的库函数几乎肯定会使调用程序可以访问成功标志。这对Python更直接可用。
所有这些都显然影响了你已经提到过的表现。
另外一点,如果您自己开发库,您可能会在一段时间后发现Python工作流已经使整个命令行界面过时,因此您可以完全放弃支持它并节省大量时间。
所以我认为有一个明确的例子可以用于Python绑定。对我来说,Python最大的优势之一就是可以轻松创建和维护这些包装器。不幸的是,大约有7或8个同样简单的方法。首先,我建议使用ctypes
,因为它不需要编译器,可以使用PyPy
。为了获得最佳性能,请使用本机C-Python API,我也发现它很容易学习。