При импорте модуля при нажатии кнопки

Я пишу небольшой script, который собирает некоторую информацию с помощью scapy, а затем возвращает некоторый xml-код, который я передам на интерфейс xmlrpc metasploit. Мне бы хотелось, чтобы мой script возвращал xml и никаких дополнительных предупреждений и т.д.

Я могу подавить большинство scapy-выход, добавив опцию verbose=0 в мою команду sr1. Что я до сих пор получаю перед каждым выходом, и я предполагаю, что он возвращает это предупреждение, когда я загружаю модуль, это:

 WARNING: No route found for IPv6 destination :: (no default route?)

Я могу легко перенаправить этот вывод, вызвав мой script следующим образом:

 ./myscript 2> /dev/null

но я хотел бы включить это в script. Для этого я нашел подсказку, что у вас может быть класс NullDevice, который ничего не пишет, а затем установите sys.stderr на экземпляр этого класса NullDevice.

Это работает только после того, как я уже загрузил модуль, поэтому у меня все еще есть предупреждение, и оно перенаправляет только следующие сообщения, отправленные в stderr.

Как я могу подавить это предупреждающее сообщение на экране?

Ответ 1

Вы можете избавиться от предупреждений scapy, добавив:

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

до импорта Scapy. Это приведет к подавлению всех сообщений с более низким уровнем серьезности, чем сообщения об ошибках.


, например:

import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
...

Ответ 2

Я думаю, что это правильный путь.

>>> import sys
>>> sys.stderr = None            # suppress stderr
>>> from scapy.all import *
>>> sys.stderr = sys.__stderr__  # restore stderr
>>> print("other errors can be shown", file=sys.stderr)
other errors can be shown
>>> 

Ответ 3

Я думаю, возможно, версия python3 scapy печатает сообщение с другого регистратора или на высоком уровне. Здесь некоторый код, который я использовал для подавления вывода на импорт модуля.

from contextlib import contextmanager

# It looks like redirect_stderr will be part of Python 3.5 as follows:
# from contextlib import redirect_stderr
# Perhaps if you're looking at this code and 3.5 is out, this function could be
# removed.
@contextmanager
def redirect_stderr(new_target):
    """
    A context manager to temporarily redirect stderr. Example use:
    with open(os.devnull, 'w') as f:
        with redirect_stderr(f):
            # stderr redirected to os.devnull. No annoying import messages
            # printed on module import
            from scapy.all import *
    # stderr restored
    """
    import sys
    old_target, sys.stderr = sys.stderr, new_target # replace sys.stdout
    try:
        yield new_target # run some code with the replaced stdout
    finally:
        sys.stderr = old_target # restore to the previous value


# Don't print the annoying warning message that occurs on import
with open(os.devnull, 'w') as errf:
    with redirect_stderr(errf):
        from scapy.all import sr, ICMP, IP, traceroute

Ответ 4

С Python3, переопределением sys.stderr в None выбрано исключение. AttributeError: объект "NoneType" не имеет атрибута "write". Вместо этого, определяя его на os.devnull, выполняется задание:

import os
import sys
sys.stderr = os.devnull # suppress stderr
from scapy.all import *
sys.stderr = sys.__stderr__ # restore stderr