Не удается перехватить / перенаправить предупреждения OpenBabel в python / pybel - PullRequest
0 голосов
/ 13 марта 2019

Я использую pybel для преобразования 1000 строк SMILES в базе данных в каноническую форму.Когда я делаю это, я получаю около 300 предупреждений.Большинство из них:

==============================
*** Open Babel Warning  in OpenBabel::OBSmilesParser::ParseSmiles
  Ignoring stereochemistry. Not enough connections to this atom. 
==============================

Полагаю, никто не думал, что будет важно включить строку с проблемой.

Я предполагал, что предупреждения будут записаны в sys.stderr.Видимо, это так, потому что эта командная строка: python foo.py 2> err.txt отправила предупреждения в файл.Но предупреждения оказались забуференными.Поэтому я попытался очистить sys.stderr до и после записи строки для преобразования, как показано ниже.

def canonicalize(smiles):
    """
    Returns canonical form of a SMILES string.  Uses OpenBabel.
    """
    print(file=sys.stderr, flush=True)
    print(smiles,file=sys.stderr,flush=True)
    canonicalizer = OBConversion()
    canonicalizer.SetOutFormat('smi')
    canonicalizer.SetOptions('inc', OBConversion.OUTOPTIONS)
    c = canonicalizer.WriteString(readstring('smi', smiles).OBMol)[:-1]
    print(file=sys.stderr, flush=True)
    print("----->", c, file=sys.stderr)
    print(file=sys.stderr, flush=True)
    return  c

Но я все еще получаю асинхронные результаты.(Как вы можете видеть по номерам строк в этом поиске, предупреждения появляются в группе, на самом деле около 35 предупреждений в этом скоплении.)

Line 2965:   Ignoring stereochemistry. Not enough connections to this atom. 
Line 2968:   Ignoring stereochemistry. Not enough connections to this atom. 
Line 2971:   Ignoring stereochemistry. Not enough connections to this atom. 
Line 2974:   Ignoring stereochemistry. Not enough connections to this atom. 
Line 2977:   Ignoring stereochemistry. Not enough connections to this atom. 

Как я могу записать свою трассировку в то же местокак OpenBabel, либо перенаправив свой поток на stderr в python, либо захватывая его поток и записывая в него из python, либо просто сбрасывая свои буферы из python?

...