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")
3 Réponses :
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!
J'ai redirigé la sortie d'impression vers sys.stderr . Cela a résolu mon but.
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.
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.")
print ()utilisesys.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 danssys.stdoutpar défaut. Vous pouvez cependant remplacer ce comportement dans l'argumentfilede la fonctionprint.vous ne pouvez rediriger
print ()que vers un fichier oustderrmais vous devez le faire dans le codeprint ("Print", file = sys.stderr) code>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 questdoutcar vous ne définissez questdout = subprocess.PIPEle rediriger vers
stderra résolu mon objectif. Merci.