我有依赖于boost::uuids::uuid
的现有工作代码。现在我尝试从中生成一个python模块。SWIG成功地生成了所有重要的类和函数。但是我面临着获取或返回boost uuid的函数的问题。在
我想在boostuuid和pythonuuid之间进行转换。有我可以用的uuid.i吗?我看到有一个uuid python模块,我知道我可以用PyImport_ImportModule("uuid")
从{}导入该模块。在
但是如何在typemap
中实例化和使用python的uuid类呢?在
Tags:
使用
PyImport_ImportModule
调用来做任何正确的操作都是相当直接的。您需要做的是弄清楚如何在两个类型之间封送uuid,然后为每个方向编写一个类型映射。最后我使用了字符串表示,因为在我看来,这是最简单的可移植方法。这是在两个方向上使用uuid_io.hpp的IO运算符。在当我们像这样包装Python代码时,根本看不到boost类型,反之亦然。在
我假设您的目标是python3.4,但是我所做的一切都应该是简单的调整,以适应旧的Python。在
首先,我把一个C++头文件放在一起演示了我实现的包:
没有什么聪明的地方,只有一个功能,每个方向传递的对象。在
接下来,我编写了一些Python来练习我想要生成的接口:
^{pr2}$最后是一个SWIG接口,在我编写了实际的UUID包装之后,它将生成这个模块。在
完成所有这些之后,我们现在可以编写一个适用于我们的场景的boost_uid.i实现:
^{4}$我确实考虑过使用
boost::python
来简化一些代码,因为我们正在包装它。不过,最后我还是没有为此烦恼。在您还可以使用boost的
lexical_cast
来避免我使用的stringstream。这在很大程度上取决于品味。在这些都不是超高性能的代码,但是当你跨越语言边界时,它也不太可能成为系统的瓶颈。您可以使用boost和Python的UUID模块提供的逐字节访问,使其成为直接复制操作,但我避免了这一点,因为需要考虑endianness,这增加了复杂性。在
注:
所有这些都应该是相当容易添加,根据需要使用这个作为起点。在
这将按预期编译和运行:
相关问题 更多 >
编程相关推荐