При импорте модуля при нажатии кнопки
Я пишу небольшой 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