Question

J'écris une macro ipython qui traite la sortie d'un programme. La chose est, le programme peut parfois écrire à stderr, donc si je fais quelque chose comme ceci:


out = !my_program

la variable out ne contiendra pas la sortie. Je pense qu'il contiendra le code de sortie (corrigez-moi si je me trompe).

Comment puis-je capturer les flux stdout et stderr?

Était-ce utile?

La solution

foo 2> & 1 signifie rediriger toute la production, y compris la poignée 2 (qui est, STDERR), à partir de la commande foo pour traiter 1 (qui est, STDOUT)
alors voici out =! foo 2> & 1 peut-être assez bon. ci-dessous est la démo:
egg.py:

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

0,10 IPython

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

Hope this helps

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top