首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中串化swig矩阵对象

如何在python中串化swig矩阵对象
EN

Stack Overflow用户
提问于 2010-03-31 05:10:51
回答 2查看 2.4K关注 0票数 4

我使用的是openbabel的swig包装器(用C++写的,通过swig提供了一个python包装器)

下面我只是用它来读取一个分子结构文件,并得到它的unitcell属性。

代码语言:javascript
复制
import pybel
for molecule in pybel.readfile('pdb','./test.pdb'):
    unitcell = molecule.unitcell
    print unitcell
   |..>     
   |..>     
<openbabel.OBUnitCell; proxy of <Swig Object of type 'OpenBabel::OBUnitCell *' at 0x17b390c0> >

单元格具有函数CellMatrix(),

代码语言:javascript
复制
unitcell.GetCellMatrix()
   <22> <openbabel.matrix3x3; proxy of <Swig Object of type 'OpenBabel::matrix3x3 *' at 0x17b3ecf0> >

OpenBabel::matrix3x3类似于:

代码语言:javascript
复制
1 2 3
4 5 6
7 8 9

我想知道如何打印出matrix3*3的内容。我已经用它试过__str____repr__了。

在python中,有没有什么通用的方法来串化swing包装的矩阵的内容?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2010-03-31 05:42:31

基于这个openbabel文档,看起来Python绑定没有提供打印matrix3x3 object的好方法是有原因的。matrix3x3 C++类重载了<<操作符,SWIG将简单地忽略它:

http://openbabel.org/api/2.2.0/classOpenBabel_1_1matrix3x3.shtml

这意味着您需要修改SWIG界面文件(查看http://www.swig.org/Doc1.3/SWIGPlus.html#SWIGPlus_class_extension),以便在C++中的openbabel::matrix3x3中添加一个__str__方法,该方法包装了<<运算符。您的方法可能看起来很像

代码语言:javascript
复制
std::string __str__() {
  //make sure you include sstream in the SWIG interface file
  std::ostringstream oss(std::ostringstream::out);
  oss << (*this);
  return oss.str();
}

我相信在这种情况下,SWIG可以正确处理返回类型为std::string的C++,但如果不能,您可能不得不尝试返回一个字符数组。

此时,您应该能够重新编译绑定,并重新运行Python代码。在matrix3x3对象上调用str()现在应该会显示在C++中使用<<操作符显示的内容。

票数 5
EN

Stack Overflow用户

发布于 2012-06-21 04:27:49

根据@jhoon的回答,SWIG似乎不能识别std::string返回类型,因此将函数更改为返回const char*。此外,由于它是类外的函数,所以不能使用self,但必须使用SWIG的$self变量。

因此,在SWIG .i文件中,如果您放入以下内容:

代码语言:javascript
复制
%extend OpenBabel::matrix3x3 {
  const char* __str__() {
    std::ostringstream out;
    out << *$self;
    return out.str().c_str();
  }
};

在matrix3x3上调用Python的print时,应该会得到所需的结果。

如果您发现自己将此代码添加到许多类中,请考虑将其包装在宏中,如下所示:

代码语言:javascript
复制
%define __STR__()
const char* __str__() {
  std::ostringstream out;
  out << *$self;
  return out.str().c_str();
}
%enddef

然后使用以下命令将其添加到类中:

代码语言:javascript
复制
%extend OpenBabel::matrix3x3 {
  __STR__()
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2548779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档