1
votes

Capturez la sortie de ONLY stdout en python

VERSION PYTHON - 3.5.2 OS - Ubuntu 16.04 LTS

J'utilise actuellement les instructions stdout et print pour écrire sur le terminal. Je veux capturer la sortie de la commande SEULEMENT sys.stdout.write et non les commandes d'impression Donc, par exemple, si mon code est -

['HelloPRINT', '']

Je veux capturer uniquement "Hello" et non "PRINT".

J'utilise actuellement ceci:

x = subprocess.run(['python3 test.py'] , shell = True , stdout = subprocess.PIPE).stdout.decode('utf-8')

qui me donne cette sortie:

import sys
sys.stdout.write("Hello")
print("PRINT")


6 commentaires

print () utilise sys.stdout.write () pour afficher le texte. Mais suproccess ne voit que le texte envoyé par le système et il ne sait pas ce que vous avez utilisé pour envoyer du texte au système.


print écrit dans sys.stdout par défaut. Vous pouvez cependant remplacer ce comportement dans l'argument file de la fonction print .


vous ne pouvez rediriger print () que vers un fichier ou stderr mais vous devez le faire dans le code print ("Print", file = sys.stderr)


Alors, quand je le redirige vers sys.stderr , qu'advient-il du texte?


lorsque vous l'exécuterez dans la console / le terminal, vous verrez tout le texte - stdout` et stderr - mais le sous-processus n'obtiendra que stdout car vous ne définissez que stdout = subprocess.PIPE


le rediriger vers stderr a résolu mon objectif. Merci.


3 Réponses :


1
votes

Vous ne pouvez pas faire cela car print () utilise sys.stdout.write () en interne. La session REPL suivante illustre ceci:

>>> import sys
>>> class StdoutProxy:
...  def write(self, text):
...   return len(text) # do nothing
...
>>> sys.stdout = StdoutProxy()
>>> print("Hello!")
>>> sys.stdout = sys.__stdout__  # reset stdout to its original state
>>> print("Hello!")
Hello!


1 commentaires

J'ai redirigé la sortie d'impression vers sys.stderr . Cela a résolu mon but.



2
votes

print () utilise sys.stdout.write () pour afficher le texte.

Outre suproccess , ne voyez que le texte envoyé par le système et il ne sait pas ce que vous avez utilisé pour envoyer du texte au système.

Vous pouvez uniquement dans le code rediriger print () vers sys.stderr

python script.py | sort

et alors vous verrez toujours tout le texte lorsque vous exécutez dans la console mais vous n'obtiendrez que sys.stdout lorsque vous utilisez sous-processus

Vous n'obtiendrez également stdout dans le fichier si vous utilisez dans la console

python script.py > stdout.txt

ou vous redirigez vers un autre programme

import sys
sys.stdout.write("Hello")
print("PRINT", file=sys.stderr)

Au lieu de print (..., file = sys.stderr) , vous pouvez également utiliser sys.stderr.write ("PRINT \ n") mais vous devez ajouter "\ n" à la fin manuellement.


0 commentaires

1
votes

Vous pouvez définir votre propre version de la fonction print comme ceci:

$ python3 redirect_print.py 1> /dev/null
Print some numbers...
0
1
2
3
4
5
6
7
8
9

Console

import sys

def get_my_print(file=sys.stdout):
    _original_print = print
    def my_print(*objects, sep='', end='\n', file=file, flush=False):
        _original_print(*objects, sep='', end='\n', file=file, flush=False)
    return my_print

original_print = print
print("Redirect print to stderr...")
print = get_my_print(sys.stderr)

print("Print some numbers...")
for x in range(10):
    print(x)

print = original_print
print("Done.")


0 commentaires