несоответствие перенаправления sys.stderr в IPython и консоли - PullRequest
1 голос
/ 19 августа 2011

Перенаправление sys.stderr в текстовый файл в IPython и консоли (терминал Gnome) дает разные результаты.

f=open('std.log','w')
sys.stderr=f
raise Exception,"message goes here"

В IPython сообщение об ошибке выводится на экран.

In [13]: run std.py

---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)

/home/xiaohan/code/diving-in-python/htmlparser/std.py in <module>()
      2 f=open('std.log','w')
      3 sys.stderr=f
----> 4 raise Exception,"message goes here"
      5 
      6

Exception: message goes here
WARNING: Failure executing file: <std.py>

Однако, если я запустил его непосредственно в консоли.

python std.py 

Сообщение об ошибке скрыто и перенаправлено в текстовый файл.

Любые предложения о том, что здесь происходит ??

1 Ответ

2 голосов
/ 19 августа 2011

Проблема в не записи в stderr, а в команде run IPython, перехватывающей исключения.Когда программа вызывает необработанное исключение, IPython распечатает обратную трассировку на своей собственной консоли и добавит дополнительное предупреждение ( ПРЕДУПРЕЖДЕНИЕ: ошибка при выполнении файла ).Это делается путем установки функции перехвата исключений как sys.excepthook.

Если вы явно напишите в sys.stderr в своем тестовом скрипте, он будет записан в файл журнала, как и ожидалось.

Чтобы увидеть ловушку исключения, добавьте print(sys.excepthook) в ваш скрипт.При непосредственном выполнении это будет <built-in function excepthook>, внутри IPython что-то вроде <bound method InteractiveShell.excepthook of <IPython.iplib.InteractiveShell object at 0x022FA3F0>>.

...