Question Quels sont exactement les flux standard s'il n'y a pas de fenêtre de terminal / console ouverte pour l'interpréteur python?


Sous Ubuntu Desktop (Unity) lorsqu'un script est marqué comme exécutable et que je clique sur le fichier, une fenêtre apparaît comme celle-ci dans l'image:

enter image description here

pyscript.py est un fichier script Python exécutable avec un shebang: #!/usr/bin/python où / usr / bin / python est le chemin d'accès à l'interpréteur Python. Comme je ne lance pas ce processus dans une fenêtre de terminal, parce que je viens de cliquer sur "Exécuter", je pensais qu'au départ, il n'y aurait pas de flux standard pour le processus; En expérimentant davantage, j'ai réalisé que tous les flux standard étaient disponibles:

pyscript.py

#!/usr/bin/python3
import sys, os
f = file=open("output.txt", "w")
print(sys.stdout, sys.stdin, sys.stderr, sep='\n', file=f)

output.txt

<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>
<_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>

Ce qui soulève la question, il n'y a pas de fenêtre de terminal fonctionnant en arrière-plan, à quoi sys.stdout, stdin et stderr sont-ils connectés? Techniquement, exécuter Python sans fenêtre de console sous Windows avec .pyw Je reçois la même sortie.

Jetez un oeil à cette question: pythonw.exe ou python.exe?

Une réponse indique ce qui suit:

Courants standards  sys.stdin, sys.stdout et sys.stderr sont Indisponible.

L'accent que les flux standard ne sont pas disponibles ne semble pas être vrai lorsque je teste cela avec Python 2.7 dans Windows 10 en cliquant sur le bouton .pyw fichier, cependant, dans le registre Windows .pyw les fichiers sont associés à Python 2.X qui s'exécute pythonw.exe dans ma machine.

Cette question est un fouillis Unix / Windows!


10
2018-06-05 21:44


origine


Réponses:


Comme d'autres l'ont mentionné, la question n'est pas spécifique à Python. Lorsqu'un processus est généré, il est du devoir du parent de définir les descripteurs de fichier de l'enfant (ou de les autoriser à être hérités).

Donc, ce n'est même pas spécifique à l'OS, mais en réalité spécifique à l'application. Par exemple, vous pouvez avoir un fichier Anser différent pour Gnome et KDE. Ou lorsque vous exécutez le fichier depuis Windows Explorer ou 7-Zip (je pense que je sais comment cela fonctionne sur Unix, pas sur Windows). Différentes applications générant le processus peuvent être en train de faire des arrangements différents.

Sous Linux, vous pouvez trouver en exécutant lsof sur le processus python, qui listera les fichiers ouverts et vous indiquera où va exactement votre stdout. Voici votre code, modifié pour faire juste cela:

#!/usr/bin/env python

# vi: ai sts=4 sw=4 et

import sys, os, pprint
import subprocess

f = open("/tmp/output.txt", "w")

for stream in (sys.stdout, sys.stdin, sys.stderr):
    print (stream, file=f)
    print ("STTY?", stream.isatty(), file=f)
    print ("fileno:", stream.fileno(), file=f)
    print ("name:", stream.name, file=f)

#    print (pprint.pprint(dir(stream)), file=f)
    print (file=f)

subprocess.call ("lsof -p %s" % os.getpid(), stdout = f, shell = True)

Seule la dernière ligne est réellement importante. Voir la sortie pour une exécution normale:

(...)
test.py 29722 xxx    0u   CHR  136,4      0t0      7 /dev/pts/4
test.py 29722 xxx    1u   CHR  136,4      0t0      7 /dev/pts/4
test.py 29722 xxx    2u   CHR  136,4      0t0      7 /dev/pts/4

Et lors de la redirection de la sortie vers un fichier:

(...)
test.py 29728 xxx    0u   CHR  136,4      0t0       7 /dev/pts/4
test.py 29728 xxx    1w   REG   0,38        0 2070222 /tmp/asdf.txt
test.py 29728 xxx    2u   CHR  136,4      0t0       7 /dev/pts/4

Voir que le fichier n ° 1 a changé? La même chose se produira lorsque vous le lancerez depuis Unity, vous indiquant où cela se passe.

Je n'ai pas reproduit exactement votre problème, car mon gestionnaire de fichiers Gnome 3 n'exécutera pas de tels scripts et je ne le regarderais pas, mais je suis curieux de savoir où vous allez.


2
2017-12-02 15:28