Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Web
  • » можно ли обрабатывать поток stderr? [RSS Feed]

#1 Май 12, 2011 10:30:07

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

можно ли обрабатывать поток stderr?

сейчас скрипт питона запускается у меня как cgi в апаче
stderr копируется в stdout - os.dup2(1, 2)

не нравится то, что все traceback валятся в браузер как обычный текст, без форматирования
можно ли как-то оборачивать выдачу stderr хотя бы в <pre>?



Офлайн

#2 Май 12, 2011 10:53:54

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

можно ли обрабатывать поток stderr?

Попробуй этого, только вместо stdout -> stderr.
Возможно оно не за конфликтует с os.dup2(1, 2).

хотя можно os.dup2(1, 2) выбросить и сделать свой на основе примера по ссылке.

Офлайн

#3 Май 12, 2011 11:13:13

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

можно ли обрабатывать поток stderr?

Могу предложить два варианта:
1. Сделать pipe, перенаправить stderr в этот pipe, а его выход обрабатывать отдельным потоком.
2. Вызывать промежуточный процесс, который будет вызывать твой cgi-шник и из stderr и stdout формировать результат в нужном виде.



Офлайн

#4 Май 12, 2011 14:03:34

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

можно ли обрабатывать поток stderr?

import sys

class MyStdio(object):
def __init__(self):
self.io = sys.stderr
sys.stderr = self
def write(self,s):
sys.stdout.write('*'+s)

MyStdio()

a = 0/0
результат:
*Traceback (most recent call last):
* File "/media/data/projects/test/src/c.py", line 14, in <module>
* *a = 0/0
*ZeroDivisionError*: *integer division or modulo by zero*
подменяет, выводит на стандартный

Офлайн

#5 Май 12, 2011 14:23:59

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

можно ли обрабатывать поток stderr?

а лучше сделать так, всю программу завернуть в try и трейсбек выводить обычным print'ом с нужным оформлением

Офлайн

#6 Май 12, 2011 16:22:32

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

можно ли обрабатывать поток stderr?

ок, спасибо
сделал так:

class MyErr(object):
def __init__(self):
sys.stderr = self

def write(self, line):
line = cgi.escape(line).replace(' ', '&nbsp;').replace('\n', '<br />').replace('"', '\\"')
print('<script>ap("%s")</script>' % line)

myerr = MyErr()
os.dup2(1, 2)
а на экране есть сворачиваемый div с абсолютным позиционированием - в нем и накапливаются ошибки скрипта, не смешиваясь с выводом лога



Офлайн

#7 Май 12, 2011 16:29:21

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

можно ли обрабатывать поток stderr?

Игнат, добавьте в MyErr метод .flush()
Он может ничего не делать — но некоторые библиотеки любят, чтобы у stdout/stderr этот метод был.



Офлайн

#8 Май 12, 2011 19:01:47

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

можно ли обрабатывать поток stderr?

Андрей Светлов
спасибо

сейчас ещё один вопрос появился
когда у меня в гуи-варианте зависали потоки - убить их можно было только убив процесс дебаггера Комодо ИДЕ

а если в веб-версии в потоках происходят исключения - такое зависание исключено? не придется убивать руками зависшие cgi-процессы питона?



Отредактировано (Май 12, 2011 19:02:46)

Офлайн

#9 Май 13, 2011 11:47:58

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

можно ли обрабатывать поток stderr?

Ничего не исключено. Будут висеть!



Офлайн

#10 Май 13, 2011 13:55:32

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

можно ли обрабатывать поток stderr?

а как же их тогда убивать? это процессы самого питона?



Офлайн

  • Начало
  • » Web
  • » можно ли обрабатывать поток stderr?[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version