我使用的是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> >单元格具有函数CellMatrix(),
unitcell.GetCellMatrix()
<22> <openbabel.matrix3x3; proxy of <Swig Object of type 'OpenBabel::matrix3x3 *' at 0x17b3ecf0> >OpenBabel::matrix3x3类似于:
1 2 3
4 5 6
7 8 9我想知道如何打印出matrix3*3的内容。我已经用它试过__str__和__repr__了。
在python中,有没有什么通用的方法来串化swing包装的矩阵的内容?
谢谢
发布于 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__方法,该方法包装了<<运算符。您的方法可能看起来很像
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++中使用<<操作符显示的内容。
发布于 2012-06-21 04:27:49
根据@jhoon的回答,SWIG似乎不能识别std::string返回类型,因此将函数更改为返回const char*。此外,由于它是类外的函数,所以不能使用self,但必须使用SWIG的$self变量。
因此,在SWIG .i文件中,如果您放入以下内容:
%extend OpenBabel::matrix3x3 {
const char* __str__() {
std::ostringstream out;
out << *$self;
return out.str().c_str();
}
};在matrix3x3上调用Python的print时,应该会得到所需的结果。
如果您发现自己将此代码添加到许多类中,请考虑将其包装在宏中,如下所示:
%define __STR__()
const char* __str__() {
std::ostringstream out;
out << *$self;
return out.str().c_str();
}
%enddef然后使用以下命令将其添加到类中:
%extend OpenBabel::matrix3x3 {
__STR__()
};https://stackoverflow.com/questions/2548779
复制相似问题