Форум сайта python.su
сейчас скрипт питона запускается у меня как cgi в апаче
stderr копируется в stdout - os.dup2(1, 2)
не нравится то, что все traceback валятся в браузер как обычный текст, без форматирования
можно ли как-то оборачивать выдачу stderr хотя бы в <pre>?
Офлайн
Попробуй этого, только вместо stdout -> stderr.
Возможно оно не за конфликтует с os.dup2(1, 2).
хотя можно os.dup2(1, 2) выбросить и сделать свой на основе примера по ссылке.
Офлайн
Могу предложить два варианта:
1. Сделать pipe, перенаправить stderr в этот pipe, а его выход обрабатывать отдельным потоком.
2. Вызывать промежуточный процесс, который будет вызывать твой cgi-шник и из stderr и stdout формировать результат в нужном виде.
Офлайн
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*
Офлайн
а лучше сделать так, всю программу завернуть в try и трейсбек выводить обычным print'ом с нужным оформлением
Офлайн
ок, спасибо
сделал так:
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)
Офлайн
Игнат, добавьте в MyErr метод .flush()
Он может ничего не делать — но некоторые библиотеки любят, чтобы у stdout/stderr этот метод был.
Офлайн
Андрей Светлов
спасибо
сейчас ещё один вопрос появился
когда у меня в гуи-варианте зависали потоки - убить их можно было только убив процесс дебаггера Комодо ИДЕ
а если в веб-версии в потоках происходят исключения - такое зависание исключено? не придется убивать руками зависшие cgi-процессы питона?
Отредактировано (Май 12, 2011 19:02:46)
Офлайн
Ничего не исключено. Будут висеть!
Офлайн
а как же их тогда убивать? это процессы самого питона?
Офлайн