Como posso capturar a saída de erro a partir do shell ipython?
Pergunta
Eu estou escrevendo um macro ipython que processa a saída de um programa. A coisa é, o programa, por vezes, pode escrever para stderr
, por isso, se eu faço algo como isto:
out = !my_program
a variável out
não irá conter a saída. Eu acho que ele irá conter o código de saída (me corrija se eu estiver errado).
Como posso capturar ambos os fluxos stdout e stderr?
Solução
foo 2> & 1 significa redirecionar toda a saída, incluindo identificador 2 (ou seja, STDERR), do comando foo para lidar com 1 (ou seja, STDOUT)
então aqui out =! foo 2> & 1 talvez bom o suficiente. abaixo é a demo:
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
Espero que isso ajude
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow