我有一个关于 python 绑定的问题。
我有一个命令行,它公开了一些功能,并且代码被重构以通过共享库提供功能。我想知道“为共享库编写 python 绑定”与“直接调用命令行”相比,我得到的真正优势是什么。
我认为一个明显的优势是性能,共享库将链接到同一个进程,并且可以在同一个进程中调用该功能。它将避免通过命令行生成新进程。
我可以从为这种情况编写 python 绑定中获得任何其他优势吗?
谢谢。
我有一个关于 python 绑定的问题。
我有一个命令行,它公开了一些功能,并且代码被重构以通过共享库提供功能。我想知道“为共享库编写 python 绑定”与“直接调用命令行”相比,我得到的真正优势是什么。
我认为一个明显的优势是性能,共享库将链接到同一个进程,并且可以在同一个进程中调用该功能。它将避免通过命令行生成新进程。
我可以从为这种情况编写 python 绑定中获得任何其他优势吗?
谢谢。
我几乎无法想象有人会更喜欢包装库的命令行界面而不是包装库本身。(除非有一个库带有一个简洁的命令行界面,而内部却是一团糟;但 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,我也发现它非常容易学习。