2009-08-17 81 views
0

我在寫一個處理程序輸出的ipython宏。問題是,該程序有時會寫信給stderr,所以如果我做這樣的事情:如何捕獲ipython shell的錯誤輸出?


out = !my_program 

out變量將不包含輸出。我認爲它將包含退出代碼(糾正我,如果我錯了)。

如何捕獲stdout和stderr流?

回答

4

FOO 2> & 1裝置重定向的所有輸出,包括手柄2(即STDERR),從foo的命令來處理1(即,STDOUT)
所以這裏出來=!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 

希望這有助於

+1

sunqiang:UNIX過這樣的重定向(的**'2>&1' * *複製 stderr標準輸出,例如)早在MS在其系統中增加了對它的支持之前。在UNIX下它是通用的(如果你知道它們的數字,你可以重定向,複製和關閉其他文件描述符)。 – 2009-08-18 00:15:38

+0

@吉姆丹尼斯,感謝您的信息。我只是一個Linux新手。之前不知道這一點。我已經相應編輯了答案。 – sunqiang 2009-08-18 01:43:45

+0

謝謝!它確實有幫助。 – Geo 2009-08-18 07:31:21