如何捕获ipython Shell的错误输出?

1 投票
1 回答
2540 浏览
提问于 2025-04-15 13:39

我正在写一个ipython宏,用来处理一个程序的输出。问题是,这个程序有时候会把信息写到stderr,所以如果我这样做:


out = !my_program

那么out这个变量就不会包含输出内容。我觉得它会包含退出代码(如果我错了请纠正我)。

我该怎么才能同时捕获标准输出和错误输出呢?

1 个回答

4

foo 2>&1 的意思是把 foo 命令的所有输出,包括错误信息(也就是 STDERR),都重定向到标准输出(也就是 STDOUT)那里。
所以这里的 out = !foo 2>&1 可能就足够用了。下面是一个示例:
egg.py:

#!/usr/bin/env python
# -*- coding: utf8 -*-
def main():
    print 'hello'
    print 3/0
if __name__ == "__main__":
    main()

IPython 0.10

In [5]: out = !egg.py
Traceback (most recent call last):
  File "D:\python\note\egg.py", line 7, in <module>
    main()
  File "D:\python\note\egg.py", line 5, in main
    print 3/0
ZeroDivisionError: integer division or modulo by zero

In [6]: out
Out[6]: SList (.p, .n, .l, .s, .grep(), .fields(), sort() available):
0: hello

In [7]: out = !egg.py 2>&1

In [8]: out
Out[8]: SList (.p, .n, .l, .s, .grep(), .fields(), sort() available):
0: hello
1: Traceback (most recent call last):
2:   File "D:\python\note\egg.py", line 7, in <module>
3:     main()
4:   File "D:\python\note\egg.py", line 5, in main
5:     print 3/0
6: ZeroDivisionError: integer division or modulo by zero

希望这能帮到你

撰写回答