Перенаправить логи в файл в 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
Другие вопросы по тегам