用SWIG暴露boost uuid

2024-06-28 20:47:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有依赖于boost::uuids::uuid的现有工作代码。现在我尝试从中生成一个python模块。SWIG成功地生成了所有重要的类和函数。但是我面临着获取或返回boost uuid的函数的问题。在

我想在boostuuid和pythonuuid之间进行转换。有我可以用的uuid.i吗?我看到有一个uuid python模块,我知道我可以用PyImport_ImportModule("uuid")从{}导入该模块。在

但是如何在typemap中实例化和使用python的uuid类呢?在


Tags: 模块实例函数代码uuidswigboostimportmodule
1条回答
网友
1楼 · 发布于 2024-06-28 20:47:48

使用PyImport_ImportModule调用来做任何正确的操作都是相当直接的。您需要做的是弄清楚如何在两个类型之间封送uuid,然后为每个方向编写一个类型映射。最后我使用了字符串表示,因为在我看来,这是最简单的可移植方法。这是在两个方向上使用uuid_io.hpp的IO运算符。在

当我们像这样包装Python代码时,根本看不到boost类型,反之亦然。在

我假设您的目标是python3.4,但是我所做的一切都应该是简单的调整,以适应旧的Python。在

首先,我把一个C++头文件放在一起演示了我实现的包:

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/random_generator.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <iostream>

inline boost::uuids::uuid testout() {
    static boost::uuids::random_generator gen;
    return gen();
}

inline void testin(const boost::uuids::uuid& in) {
    std::cout << in << "\n";
}

没有什么聪明的地方,只有一个功能,每个方向传递的对象。在

接下来,我编写了一些Python来练习我想要生成的接口:

^{pr2}$

最后是一个SWIG接口,在我编写了实际的UUID包装之后,它将生成这个模块。在

%module test

%{
#include "test.hh"
%}

%include "boost_uuid.i"

%include "test.hh"

完成所有这些之后,我们现在可以编写一个适用于我们的场景的boost_uid.i实现:

^{4}$

我确实考虑过使用boost::python来简化一些代码,因为我们正在包装它。不过,最后我还是没有为此烦恼。在

您还可以使用boost的lexical_cast来避免我使用的stringstream。这在很大程度上取决于品味。在

这些都不是超高性能的代码,但是当你跨越语言边界时,它也不太可能成为系统的瓶颈。您可以使用boost和Python的UUID模块提供的逐字节访问,使其成为直接复制操作,但我避免了这一点,因为需要考虑endianness,这增加了复杂性。在

注:

  1. 没有正确的错误处理
  2. 对于boost UUID输入类型,没有传递值的类型映射。
  3. 对于输入,没有传递非常量引用的typemap。

所有这些都应该是相当容易添加,根据需要使用这个作为起点。在

这将按预期编译和运行:

swig3.0 -c++ -python -py3 -Wall test.i
g++ -g -std=c++1y -shared test_wrap.cxx -o _test.so -I/usr/include/python3.4 -Wall -Wextra -lpython3.4m 
python3.4 run.py
<class 'uuid.UUID'>
b37c9285-f055-4f08-b4e9-4a238be3b09d
<class 'uuid.UUID'>
cf1071e6-2e7f-45af-8920-a68290ee61d4
b37c9285-f055-4f08-b4e9-4a238be3b09d
cf1071e6-2e7f-45af-8920-a68290ee61d4

相关问题 更多 >