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.stdout
par défaut. Vous pouvez cependant remplacer ce comportement dans l'argumentfile
de la fonctionprint
.vous ne pouvez rediriger
print ()
que vers un fichier oustderr
mais 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 questdout
car vous ne définissez questdout = subprocess.PIPE
le rediriger vers
stderr
a résolu mon objectif. Merci.