如何在python中串接swig矩阵对象

2024-04-30 04:50:38 发布

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

我使用openbabel的SWIG包装器(用C++编写,并通过SWIG提供Python包装)

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

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> >

unitcell具有函数CellMatrix()

^{pr2}$

OpenBabel::matrix3x3类似于:

1 2 3
4 5 6
7 8 9

我想知道如何打印出矩阵3*3的内容。我试过__str__和{}。在

有没有一种通用的方法可以用python编写swing包装的矩阵的内容?在

谢谢


Tags: 文件ofimport内容属性矩阵pdbswig
2条回答

对于@jhoon的回答,SWIG似乎无法识别std::string返回类型,因此将函数更改为returnconstchar*。另外,由于它是类之外的函数,因此不能使用self,但必须使用SWIG的$self变量。在

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

%extend OpenBabel::matrix3x3 {
  const char* __str__() {
    std::ostringstream out;
    out << *$self;
    return out.str().c_str();
  }
};

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

如果您发现自己正在将其添加到许多类中,请考虑将其包装在一个宏中,如:

^{pr2}$

然后将其添加到类中:

%extend OpenBabel::matrix3x3 {
  __STR__()
};

根据这个openbabel文档,Python绑定没有提供打印matrix3x3 object的好方法是有原因的。^ {CD2>} C++类重载^ {< CD3>}运算符,SWIG将简单地忽略:

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

这意味着需要修改SWIG接口文件(查看http://www.swig.org/Doc1.3/SWIGPlus.html#SWIGPlus_class_extension),以将^ {< CD4>}方法添加到C++中,其中^ {CD5>}包括^ {< CD3>}运算符。你的方法看起来很像

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

我相信Syg在这种情况下将正确地处理C++的返回类型^ {< CD7>},但是如果不是,你可能需要回退一个字符数组。在

此时,您应该能够重新编译绑定,并重新运行Python代码。在^ {{CD2}}对象上调用^ {< CD8}}现在应该显示在C++中用^ {< CD3}}操作符显示的内容。在

相关问题 更多 >