Перенаправить логи в файл в Pybel?
Аналогично этому посту, но вместо изменения уровня ведения журнала я бы хотел перенаправить всю информацию регистрации в файл. Я считаю, что соответствующий вызов API:
pybel.ob.obErrorLog.SetOutputStream()
или же:
pybel.ob.OBMessageHandler().SetOutputStream()
Но SetOutputStream()
метод принимает только объекты типа std::ostream *
, а не потоки файлов Python, например open('/path/to/log.txt', 'w')
или же sys.stdout
,
TL;DR: есть ли разумный способ направить информацию журнала в файл в PyBel?
1 ответ
Один из способов обойти эту ошибку — захватить стандартный поток ошибок.
К сожалению, нельзя напрямую перенаправить стандартную ошибку в IOStream, поскольку OpenBabel работает с базовой стандартной ошибкой C и не знает об ошибке Python.
Но благодаря этому ответу Stack Overflow на самом деле можно зафиксировать основной поток ошибок в строку.
С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 line