11
votes

Comment savoir si le script Python est exécuté dans un terminal ou via une interface graphique?

Je travaille sous Linux et je me demande comment avoir Python dire s'il est exécuté directement à partir d'un terminal ou via une interface graphique (comme Alt-F2) où une sortie devra être envoyée à une fenêtre plutôt que de stdout qui apparaîtra dans un terminal.

en bash, cela fait par: xxx

Comment cela peut-il être accompli dans Python? En d'autres termes, l'équivalent de [-t 0])?


6 commentaires

docs.python.org/library/os.html#os.isatty Faites ce dont vous avez besoin?


duplicache possible de Comment puis-je Vérifiez si un script Python a été démarré de manière interactive? Easy Way: sys.stdout.isatty ()


Notez que ISATTY ne permettra pas de détecter correctement les tuyaux


sys.stdout.isatty () et os.isatty (0) sont exactement ce que je cherchais. Super. Merci. Si vous le ferez comme une réponse, je l'accepterai.


@Cobal, vous avez raison. C'est un duplicata du concept, je viens de demander d'une manière différente. Merci.


Dupliqué possible de Vérification de la coque interactive dans un script Python


5 Réponses :


10
votes
$ echo ciao | python -c 'import sys; print sys.stdin.isatty()'
False
Of course, your GUI-based IDE might choose to "fool" you by opening a pseudo-terminal instead (you can do it yourself to other programs with pexpect, and, what's sauce for the goose...!-), in which case isatty or any other within-Python approach cannot tell the difference.  But the same trick would also "fool" your example bash program (in exactly the same way) so I guess you're aware of that.  OTOH, this will make it impossible for the program to accept input via a normal Unix "pipe"!A more reliable approach might therefore be to explicitly tell the program whether it must output to stdout or where else, e.g. with a command-line flag.

1 commentaires

Il y a des moments où j'ai utilisé des drapeaux explicites tout en étincelant, mais parfois, je voudrais une solution automatique de la solution dans quelles circonstances seront nécessaires. Je vais toujours garder cette pensée pour le brûleur arrière, cependant.



0
votes

Il existe plusieurs exemples de ceci sur Néage qui compte pour un troisième cas: en cours d'exécution à une invite de python interactive.


2 commentaires

Je suis venu aimer OptParse pour CL analysant. Préférez-vous les getopts? Si oui, je suis curieux de savoir pourquoi. Je suis nouveau à la programmation et je suis impatient d'apprendre pourquoi et pourquoi.


Optparse est mieux. Mais GetOpt fonctionne la même chose en C, Python, Haskell, quelle que soit la langue que vous puissiez penser. Si vous travaillez dans de nombreuses langues différentes, vous pouvez le préférer.



2
votes

J'ai nettoyé SE pour une réponse à cela, mais partout indiqué l'utilisation de sys.stdout.isatty () code> ou os.isatty (sys.stdout.fileno ()) code >. Ni l'un ni l'autre de ces cas de test de l'interface graphique de l'interface graphique.

Test Standard Entrée était la seule chose qui a fonctionné pour moi: P>

sys.stdin.isatty()


0 commentaires

0
votes

J'ai eu le même problème et j'ai fait comme suit:

import sys

mode = 1
try:
    if sys.stdin.isatty():
        mode = 0
except AttributeError:  # stdin is NoneType if not in terminal mode
    pass

if mode == 0:
    # code if terminal mode ...
else:
    # code if gui mode ...


0 commentaires

0
votes

in Bash j'utilise ce script: xxx pré>

Lorsque vous créez un raccourci de bureau pour appeler le script, la sortie est la suivante: p>

#import os
result = os.popen("echo $TERM")
result2 = os.popen("env | grep TERM")


0 commentaires