2025, Oct 31 13:16
Как спрятать DEBUG-логи PyVISA с помощью logging в Python
Почему в консоли появляются «DEBUG:pyvisa», и как их убрать: отключаем логи PyVISA или повышаем уровень логгера через logging в Python. Примеры кода. Подробно.
При автоматизации приборов по USB через PyVISA консоль может внезапно заполниться строками вроде «DEBUG:pyvisa:…». Приложение продолжает работать, но ваши собственные сообщения тонут в потоке. Хорошая новость: это не «печатает» PyVISA — срабатывает стандартная система логирования Python. Стоит взять её под контроль — и лишний шум исчезает.
Пример, который запускает шумный вывод
Следующая функция управляет детектором, выбирает усиление и смещение, задаёт частоту НЧ‑фильтра, включает и выключает измерительную функцию, а затем закрывает сессию. Логика сохранена, а названия упрощены для наглядности.
def pmt_switch_test(gain_idx=0, offset_v=-0.009, lp_hz=80000000):
    gain_v = PMT1_gain_map['voltage'].iloc[int(gain_idx)]
    import pyvisa
    import time
    mgr = pyvisa.ResourceManager()
    dev = mgr.open_resource(pmt1_addr)
    dev.write("INST:SEL GAIN")
    dev.write("SOUR:VOLT %f" % gain_v)
    dev.write("INST:SEL OFFSET")
    dev.write("SOUR:VOLT %f" % offset_v)
    dev.write("SENS:FILT:LPAS:FREQ %f" % lp_hz)
    dev.write("SENS:FUNC:ON %s" % pmt_model)
    time.sleep(5)
    dev.write("SENS:FUNC:OFF %s" % pmt_model)
    mgr.close()
В системах, где логирование настроено на уровень DEBUG, создание ResourceManager и отправка SCPI‑команд порождают множество строк с префиксом «DEBUG:pyvisa».
Что на самом деле происходит
Строки вида «DEBUG:pyvisa:…» — это сообщения стандартного модуля logging в Python. PyVISA пишет логи уровня DEBUG; если ваш процесс включает логирование на уровне DEBUG, вы их видите. Если нет — они не выводятся. Поэтому смена уровня логирования и влияет на появление этих строк.
Два практичных способа приглушить поток
Если нужно просто утихомирить консоль, можно целиком отключить логирование. Если же важны собственные журналы, а внутренности PyVISA хочется спрятать, настройте логгер с именем «pyvisa». Оба подхода показаны ниже.
Вариант 1: полностью выключить логирование
import pyvisa
import logging
# Любая предыдущая настройка логирования может оставаться; этот вызов заглушает всё
logging.disable()
rm = pyvisa.ResourceManager()       # Строки PyVISA уровня DEBUG не появляются
print(rm.list_resources())          # По‑прежнему тихо
Вариант 2: оставить свои логи, скрыть логи PyVISA
Эта настройка сохраняет ваши сообщения DEBUG и INFO, а «болтовню» PyVISA уровня DEBUG подавляет за счёт повышения уровня логгера «pyvisa».
import pyvisa
import logging
# Включаем логирование на уровне приложения
logging.basicConfig(level=logging.DEBUG)
# Настраиваем только логгер «pyvisa»
pyvisa_logger = logging.getLogger('pyvisa')
pyvisa_logger.level = logging.INFO
logging.debug('app debug visible')   # Это будет видно
logging.info('app info visible')     # Это будет видно
rm = pyvisa.ResourceManager()        # Строки PyVISA уровня DEBUG скрыты
print(rm.list_resources())           # PyVISA DEBUG остаётся скрытым
Применяем к коду управления прибором
Вот та же процедура для детектора, но уже с точечной конфигурацией логирования — ваши журналы остаются читабельными, а DEBUG‑вывод PyVISA скрыт.
import logging
import pyvisa
import time
# Сохраняем свои логи; скрываем DEBUG от PyVISA
logging.basicConfig(level=logging.DEBUG)
logging.getLogger('pyvisa').level = logging.INFO
def pmt_switch_test(gain_idx=0, offset_v=-0.009, lp_hz=80000000):
    gain_v = PMT1_gain_map['voltage'].iloc[int(gain_idx)]
    mgr = pyvisa.ResourceManager()
    dev = mgr.open_resource(pmt1_addr)
    dev.write("INST:SEL GAIN")
    dev.write("SOUR:VOLT %f" % gain_v)
    dev.write("INST:SEL OFFSET")
    dev.write("SOUR:VOLT %f" % offset_v)
    dev.write("SENS:FILT:LPAS:FREQ %f" % lp_hz)
    dev.write("SENS:FUNC:ON %s" % pmt_model)
    time.sleep(5)
    dev.write("SENS:FUNC:OFF %s" % pmt_model)
    mgr.close()
Почему это важно знать
Осознание того, что это штатный вывод logging, а не случайные print, даёт точный контроль. Можно приглушить сторонние библиотеки, не теряя собственных диагностик, и включать подробные трассировки только по необходимости. Простой рычаг, который возвращает нужное соотношение сигнал/шум в консольных процессах.
Выводы
Если в консоли появляются строки «DEBUG:pyvisa:…», это логирование Python на уровне DEBUG. Хотите тишины повсюду — вызовите logging.disable(). Нужно спрятать только PyVISA — установите для logging.getLogger('pyvisa').level значение INFO или выше. Код работы с прибором менять не требуется; достаточно корректно настроить логирование до создания ResourceManager или начала общения с устройством.