Игнат
Май 12, 2011 10:30:07
сейчас скрипт питона запускается у меня как cgi в апаче
stderr копируется в stdout - os.dup2(1, 2)
не нравится то, что все traceback валятся в браузер как обычный текст, без форматирования
можно ли как-то оборачивать выдачу stderr хотя бы в <pre>?
o7412369815963
Май 12, 2011 10:53:54
Попробуй
этого, только вместо stdout -> stderr.
Возможно оно не за конфликтует с os.dup2(1, 2).
хотя можно os.dup2(1, 2) выбросить и сделать свой на основе примера по ссылке.
agalen
Май 12, 2011 11:13:13
Могу предложить два варианта:
1. Сделать pipe, перенаправить stderr в этот pipe, а его выход обрабатывать отдельным потоком.
2. Вызывать промежуточный процесс, который будет вызывать твой cgi-шник и из stderr и stdout формировать результат в нужном виде.
o7412369815963
Май 12, 2011 14:03:34
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
Май 12, 2011 14:23:59
а лучше сделать
так, всю программу завернуть в try и трейсбек выводить обычным print'ом с нужным оформлением
Игнат
Май 12, 2011 16:22:32
ок, спасибо
сделал так:
class MyErr(object):
def __init__(self):
sys.stderr = self
def write(self, line):
line = cgi.escape(line).replace(' ', ' ').replace('\n', '<br />').replace('"', '\\"')
print('<script>ap("%s")</script>' % line)
myerr = MyErr()
os.dup2(1, 2)
а на экране есть сворачиваемый div с абсолютным позиционированием - в нем и накапливаются ошибки скрипта, не смешиваясь с выводом лога
Андрей Светлов
Май 12, 2011 16:29:21
Игнат, добавьте в MyErr метод .flush()
Он может ничего не делать — но некоторые библиотеки любят, чтобы у stdout/stderr этот метод был.
Игнат
Май 12, 2011 19:01:47
Андрей Светлов
спасибо
сейчас ещё один вопрос появился
когда у меня в гуи-варианте зависали потоки - убить их можно было только убив процесс дебаггера Комодо ИДЕ
а если в веб-версии в потоках происходят исключения - такое зависание исключено? не придется убивать руками зависшие cgi-процессы питона?
Андрей Светлов
Май 13, 2011 11:47:58
Ничего не исключено. Будут висеть!
Игнат
Май 13, 2011 13:55:32
а как же их тогда убивать? это процессы самого питона?