Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 27, 2014 17:39:29

the_questioner
Зарегистрирован: 2014-08-27
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Python3 перехват вывода в stderr

Привет.
У меня есть такой скрипт:

#!/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 скрипта?

Офлайн

#2 Авг. 27, 2014 18:05:56

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Python3 перехват вывода в stderr

the_questioner
Как его перехватить и обработать внутри моего python скрипта?
Определить в каком месте скрипта оно возникает и поставить соответствующий exception в try/except



Офлайн

#3 Авг. 27, 2014 20:28:26

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Python3 перехват вывода в stderr

the_questioner
Как его перехватить и обработать внутри моего python скрипта?

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

try:
   какой то код...
except (RuntimeError, EnvironmentError):
   обработка исключения...

Офлайн

#4 Авг. 27, 2014 22:57:06

the_questioner
Зарегистрирован: 2014-08-27
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Python3 перехват вывода в stderr

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, не работает(

Офлайн

#5 Авг. 28, 2014 07:37:40

the_questioner
Зарегистрирован: 2014-08-27
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Python3 перехват вывода в stderr

Исключение вызывает этот код

print(container.name +"\t"+ container.state +\
        "\t"+ container.get_ips()[0])

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

Отредактировано the_questioner (Авг. 28, 2014 07:37:59)

Офлайн

#6 Авг. 28, 2014 10:23:29

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Python3 перехват вывода в stderr

the_questioner
А конкретно, этот участок, если контейнер остановлен, а у него пытаются запросить ip

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



Офлайн

#7 Авг. 28, 2014 10:33:29

the_questioner
Зарегистрирован: 2014-08-27
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Python3 перехват вывода в stderr

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

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

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

Офлайн

#8 Авг. 28, 2014 19:15:24

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Python3 перехват вывода в stderr

     
  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'ом автору.

Отредактировано Alen (Авг. 28, 2014 19:15:55)

Офлайн

#9 Авг. 28, 2014 21:28:46

the_questioner
Зарегистрирован: 2014-08-27
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Python3 перехват вывода в stderr

Спасибо. Но это пока довольно сложно для меня.

Пока обхожу так:
Проверяю - если lxc контейнер выключен, значит не спрашиваю у него ip адрес.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version