Найти - Пользователи
Полная версия: Python3 перехват вывода в stderr
Начало » Python для новичков » Python3 перехват вывода в stderr
1
the_questioner
Привет.
У меня есть такой скрипт:
#!/usr/bin/env python3
import lxc
all=lxc.list_containers()
for i in all:
        try:
                container = lxc.Container(i)
                print(container.name +"\t"+ container.state +\
"\t"+ container.get_ips()[0])
        except IndexError:
                print(container.name+"\tNO IP")
Запускаю его на линуксе, где есть lxc.
И получаю такое сообщение в stderr
lxc_container: Connection refused - failed to enter namespace
Как его перехватить и обработать внутри моего python скрипта?
Budulianin
the_questioner
Как его перехватить и обработать внутри моего python скрипта?
Определить в каком месте скрипта оно возникает и поставить соответствующий exception в try/except
Alen
the_questioner
Как его перехватить и обработать внутри моего python скрипта?

Поскольку в сам код pylxc не генерирует это исключение https://github.com/cloud9ers/pylxc/blob/master/lxc/__init__.py
Скорее всего подойдёт вариант

try:
   какой то код...
except (RuntimeError, EnvironmentError):
   обработка исключения...
the_questioner
import lxc
all=lxc.list_containers()
for i in all:
        try:
                try:
                        container = lxc.Container(i)
                        print(container.name +"\t"+ container.state +\
        "\t"+ container.get_ips()[0])
                except IndexError:
                        print("Виртуальная машина не имеет ip адреса")
        except (RuntimeError, EnvironmentError):
                print("========")
Обернул в try-except, не работает(
the_questioner
Исключение вызывает этот код
print(container.name +"\t"+ container.state +\
        "\t"+ container.get_ips()[0])

А конкретно, этот участок, если контейнер остановлен, а у него пытаются запросить ip
container.get_ips()[0]
Budulianin
the_questioner
А конкретно, этот участок, если контейнер остановлен, а у него пытаются запросить ip

Ну дак и оберни этот код в try/except с соответствующим исключением.
the_questioner
Budulianin
Ну дак и оберни этот код в try/except с соответствующим исключением.

Погоди, а у меня же не вываливается никакого исключения!
У меня есть выхлоп в stderr просто.

Значит ли что оборачивать в try/except бессмысленно?
Alen
     
  try:
          try:
 

Так не делают.

try:
    что-то
except IndexError:
    что-то
except AttributeError:
    что-то
...

the_questioner
Погоди, а у меня же не вываливается никакого исключения!
У меня есть выхлоп в stderr просто.

Если TraceBack'а нет, и программа продолжает работать, то да бессмысленно.

import sys
sys.stderr.write('Error')  # Вывод текста в stderr.

Это не ошибка, это просто вывод текста.

Если Вам, каким-то образом всё-таки нужно учитывать это в логике программы, то нужно править сам исходник библиотеки, последний коммит был аж 2 года назад.
Нужно получать и проверять stderr от вызовов subprocess и вызывать в простейшем случае исключение raise RuntimeError и обрабатывать у себя, или чуть усложнить и написать своё исключение/исключения по типу

import exceptions
class MyException(exceptions.Exception):
    def __init__(self, error):
        Exception.__init__(self, error)
        self.error = error
        self.message = 'My exception'

, или объявить как в самой библиотеке

class ContainerAlreadyExists(Exception): pass

А исправленную версию лучше отправить pull request'ом автору.
the_questioner
Спасибо. Но это пока довольно сложно для меня.

Пока обхожу так:
Проверяю - если lxc контейнер выключен, значит не спрашиваю у него ip адрес.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB