Как подавить выходы из определенных модулей и методов скрытых классов в Python? - PullRequest
0 голосов
/ 24 октября 2019

Вот как выглядит код

#!/usr/bin/env python3
#encoding:utf-8
import requests, numpy, fasttext, os, sys
from itertools import product
from math import sqrt

en_model=fasttext.load_model(path='crawl-300d-2M-subword.bin')

Сценарий предназначен для обучения модели классификации с использованием некоторых методов НЛП. Здесь проблема.

Последняя строка фрагмента по неизвестной причине выводит пустую строку в stderr, даже если она работает без ошибок. Есть ли способ подавить его из вызывающего модуля, или мне нужно взломать модуль fasttext, чтобы узнать, какая строка вызывает это? В общем, есть ли способ подавить эхо stdout или stderr внутри фрагмента кода, особенно когда я знаю, что они вызваны импортируемыми модулями, а не тем, что я написал?

1 Ответ

0 голосов
/ 24 октября 2019

Вы можете проверить contextlib.redirect_stdout и contextlib.redirect_stderr

Пример:

from contextlib import redirect_stdout
from contextlib import redirect_stderr
import os


def cache_stdouterr(func):
    def wrapper():
        with open(os.devnull,"w") as f:
            with redirect_stdout(f):
                with redirect_stderr(f):
                    func()
    return wrapper


@cache_stdouterr
def noprint():
    print("notprinted")

def toprint():
    print("shouldbeprinted")

toprint()
noprint()

# python3 test_redirect.py
shouldbeprinted

Это общее решение. Для вашей конкретной проблемы вы можете попробовать это:

#!/usr/bin/env python3
#encoding:utf-8
import requests, numpy, fasttext, os, sys
from contextlib import redirect_stdout, redirect_stderr
from itertools import product
from math import sqrt

with redirect_stderr(open(os.devnull,"w")):
    en_model=fasttext.load_model(path='crawl-300d-2M-subword.bin')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...