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?

Foi útil?

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
scroll top