我使用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包装的矩阵的内容?在
谢谢
对于@jhoon的回答,SWIG似乎无法识别std::string返回类型,因此将函数更改为returnconstchar*。另外,由于它是类之外的函数,因此不能使用self,但必须使用SWIG的$self变量。在
因此,在SWIG.i文件中,如果您将以下内容放入:
在matrix3x3上调用Python的print时,应该会得到所需的结果。在
如果您发现自己正在将其添加到许多类中,请考虑将其包装在一个宏中,如:
^{pr2}$然后将其添加到类中:
根据这个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>}运算符。你的方法看起来很像
我相信Syg在这种情况下将正确地处理C++的返回类型^ {< CD7>},但是如果不是,你可能需要回退一个字符数组。在
此时,您应该能够重新编译绑定,并重新运行Python代码。在^ {{CD2}}对象上调用^ {< CD8}}现在应该显示在C++中用^ {< CD3}}操作符显示的内容。在
相关问题 更多 >
编程相关推荐