Найти - Пользователи
Полная версия: можно ли обрабатывать поток stderr?
Начало » Web » можно ли обрабатывать поток stderr?
1 2
Игнат
сейчас скрипт питона запускается у меня как cgi в апаче
stderr копируется в stdout - os.dup2(1, 2)

не нравится то, что все traceback валятся в браузер как обычный текст, без форматирования
можно ли как-то оборачивать выдачу stderr хотя бы в <pre>?
o7412369815963
Попробуй этого, только вместо stdout -> stderr.
Возможно оно не за конфликтует с os.dup2(1, 2).

хотя можно os.dup2(1, 2) выбросить и сделать свой на основе примера по ссылке.
agalen
Могу предложить два варианта:
1. Сделать pipe, перенаправить stderr в этот pipe, а его выход обрабатывать отдельным потоком.
2. Вызывать промежуточный процесс, который будет вызывать твой cgi-шник и из stderr и stdout формировать результат в нужном виде.
o7412369815963
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*
подменяет, выводит на стандартный
o7412369815963
а лучше сделать так, всю программу завернуть в try и трейсбек выводить обычным print'ом с нужным оформлением
Игнат
ок, спасибо
сделал так:

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 с абсолютным позиционированием - в нем и накапливаются ошибки скрипта, не смешиваясь с выводом лога
Андрей Светлов
Игнат, добавьте в MyErr метод .flush()
Он может ничего не делать — но некоторые библиотеки любят, чтобы у stdout/stderr этот метод был.
Игнат
Андрей Светлов
спасибо

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

а если в веб-версии в потоках происходят исключения - такое зависание исключено? не придется убивать руками зависшие cgi-процессы питона?
Андрей Светлов
Ничего не исключено. Будут висеть!
Игнат
а как же их тогда убивать? это процессы самого питона?
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