与this post类似,但我不想更改日志级别,而是将所有日志信息重定向到一个文件中。我相信有关的API调用是:
pybel.ob.obErrorLog.SetOutputStream()或者:
pybel.ob.OBMessageHandler().SetOutputStream()但是SetOutputStream()方法只接受std::ostream *类型的对象,而不是Python,例如open('/path/to/log.txt', 'w')或sys.stdout。
以下是我尝试过的几件事:
from openbabel import openbabel
import io
import sys
obHandler = openbabel.OBMessageHandler()
obHandler.SetOutputStream(io.BytesIO())
##Out: TypeError: in method 'OBMessageHandler_SetOutputStream', argument 2 of type 'std::ostream *'
obHandler.SetOutputStream(sys.stderr)
##Out: TypeError: in method 'OBMessageHandler_SetOutputStream', argument 2 of type 'std::ostream *'
with open("test.out", "w") as fd:
obHandler.SetOutputStream(fd)
##Out: TypeError: in method 'OBMessageHandler_SetOutputStream', argument 2 of type 'std::ostream *'TL;DR:是否有合理的方法将日志信息定向到PyBel中的文件?
发布于 2022-08-10 16:16:58
解决此错误的一种方法是捕获标准错误流。
不幸的是,不能将标准错误直接重定向到IOStream,因为OpenBabel是在底层C标准错误上操作,而不知道是Python。
但是,多亏了this Stack Overflow answer,实际上可以将底层错误流捕获为字符串。
在加载/导入OutputGrabber类后,您可以捕获输出如下:
import sys
from openbabel import openbabel
obConversion = openbabel.OBConversion()
obConversion.SetInFormat("sdf")
mol = openbabel.OBMol()
out = OutputGrabber(sys.stderr)
with out:
success = obConversion.ReadString(mol, "INVALID\n\n")文本现在在out.capturedtext中
print(out.capturedtext)
==============================
*** Open Babel Warning in ReadMolecule
WARNING: Problems reading a MDL file
Cannot read comment linehttps://stackoverflow.com/questions/50978464
复制相似问题