Domanda

Sto scrivendo una macro ipython che elabora l'output di un programma. Il fatto è che il programma a volte può scrivere a stderr, quindi se faccio qualcosa di simile:


out = !my_program

la variabile out non conterrà l'output. Penso che conterrà il codice di uscita (correggetemi se sbaglio).

Come faccio a catturare sia i flussi stdout e stderr?

È stato utile?

Soluzione

foo 2> & 1 mezzi reindirizzare tutto l'output, compreso la maniglia 2 (cioè STDERR), dal comando foo alla maniglia 1 (cioè, STDOUT)
ecco out =! foo 2> & 1 forse abbastanza buono. sotto è la 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

Spero che questo aiuti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top