Comment faire pour déterminer si Python script a été exécuté via la ligne de commande?
Fond
Je voudrais que mon script Python pour mettre en pause avant de sortir de l'aide de quelque chose de similaire à:
raw_input("Press enter to close.")
mais seulement si elle n'est PAS exécutée via la ligne de commande. Programmes en ligne de commande ne devrait pas se comporter de cette façon.
Question
Est-il un moyen pour déterminer si mon script Python a été appelée à partir de la ligne de commande:
$ python myscript.py
versets double-cliquant sur myscript.py
de l'ouvrir avec la valeur par défaut de l'interprète dans l'OS?
- C'est Windows, je suppose? Je pense que vous pouvez créer un lien vers votre programme et de modifier les propriétés de lien pour le faire attendre à la sortie. (À moins que vous pourriez faire quelque chose comme cela douze ans en arrière, lorsque j'ai utilisé Windows.)
- Double Possible de la Vérification de shell interactif dans un script Python
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas qu'il n'y a aucun moyen fiable de détecter (en particulier dans une croix-plate-forme de manière). Par exemple sur OS X, lorsque vous double-cliquez sur un
.py
fichier et il tuns avec "Python Lanceur", il s'exécute dans un terminal, même si vous exécutez manuellement.Mais il peut avoir d'autres questions, vous pouvez package le script avec quelque chose comme py2exe ou Platypus, alors vous pouvez avoir le double-cliquable icône exécuter le morceau de code pour les différencier (
import mycode; mycode.main(gui = True)
par exemple)Si vous êtes en cours d'exécution sans un terminal, comme lorsque vous cliquez sur "Exécuter" dans Nautilus, vous pouvez simplement vérifier si il est attaché à un ats:
Mais, comme ThomasK points, vous semblez faire allusion à l'exécuter dans un terminal qui se ferme juste après la fin du programme. Je pense qu'il n'y a aucun moyen de faire ce que vous voulez sans solution de contournement; le programme est en cours d'exécution dans un shell et attaché à un terminal. La décision de quitter immédiatement se fait juste après avoir fini avec les infos qui n'ont pas facilement disponibles (les paramètres passés à l'exécution de l'interpréteur ou un terminal).
Vous pouvez aller sur en examinant le processus parent d'informations et de détecter les différences entre les deux types d'invocations, mais c'est probablement pas la peine dans la plupart des cas. Avez-vous pensé à l'ajout d'un paramètre de ligne de commande de votre script (pensez
--interactive
)?/dev/tty
avecO_NOCTTY
drapeau. Si cela réussit, nous sommes plus susceptibles contrôlé par une borne interactive, en supposant que vous êtes sur un système POSIX.sys.stdout.isatty()
plutôt que de lastdin
version. À l'aide de lastdin
version, tapé à la machine, commande commeyourprogram <inputfile
serait réputée non-interactif.Si vous exécutez python IDLE alors "pythonw.exe" est utilisé pour exécuter le codage tandis que lorsque vous exécutez la ligne de commande "python.exe" est utilisé pour exécuter le codage. Le python chemin d'accès au dossier peut varier de sorte que vous avez à revenir sur le chemin d'accès à l'python dossier. m = '\\' m = m[0] est d'obtenir de m 'être \" parce que de s'échapper.
if 'pythonw.exe' in sys.executable: print('Running in Python IDLE')
?Cette opération est généralement effectuée manuellement/, je ne pense pas qu'il y est une manière automatique à faire ce qui fonctionne pour tous les cas.
Vous devez ajouter un
--pause
argument au script qui ne l'invite pour une touche à la fin.Lorsque le script est invoqué à partir d'une ligne de commande à la main, puis l'utilisateur peut ajouter
--pause
si vous le souhaitez, mais par défaut, il n'y aura pas d'attente.Lorsque le script est lancé à partir d'une icône, les arguments de l'icône devrait inclure la
--pause
, de sorte qu'il y a une attente. Malheureusement, vous devrez soit le document de l'utilisation de cette option afin que l'utilisateur sache qu'il doit être ajouté lors de la création d'une icône ou d'autre, de fournir une icône de la fonction de création dans votre script qui fonctionne pour votre système d'exploitation.--no-pause
serait plus simple?Ma solution a été de créer des scripts de ligne de commande à l'aide de setuptools. Voici les parties pertinentes de l'myScript.py:
Et les parties pertinentes de l'setup.py:
Maintenant, si je l'ouvre myScript.py avec l'interpréteur Python (sur Windows), la fenêtre de la console attend que l'utilisateur appuie sur entrer si une erreur se produit. Sur la ligne de commande, si je run "monscript", le programme ne sera jamais à attendre pour la saisie de l'utilisateur, avant la fermeture.
Je crois que cela PEUT être fait. Au moins, ici, est de savoir comment je l'ai eu à travailler dans Python 2.7 sous Ubuntu 14.04:
Note que, dans Ubuntu 14 avec l'environnement de bureau Gnome (aka Nautilus) -- vous pourriez avoir besoin pour ce faire:
Pour voir comment cela fonctionne, vous pouvez jouer avec ce (basé sur la réponse de @EduardoIvanec):
Bien que ce n'est pas une très bonne solution, il ne fonctionne pas (dans windows au moins).
Vous pouvez créer un fichier de commandes avec le contenu suivant:
Si vous voulez être en mesure de le faire avec un seul fichier, vous pouvez essayer ce qui suit:
Code de lot à partir de: Mettre en pause un fichier de commandes lorsqu'on double-clique, mais pas lorsqu'il est exécuté à partir d'une fenêtre de la console?
Multi-ligne dans le lot à partir de: DOS: Travailler avec les multi-ligne de chaînes
Bien, la façon la plus simple que j'ai trouvé et fait a été de simplement exécuter le programme en ligne de commande, même si elle avait couru en Python IDLE.
Ajoutez à cela le fond de votre script, et, une fois couru à partir soit d'INACTIVITÉ ou de l'Invite de Commande, il va créer un fichier, exécutez de nouveau le programme dans le CMD, et sort de la première instance.
Espérons que ça aide! 🙂
De l'idée derrière cette réponse, en ajoutant pour Win10 de compatibilité (Extraction à partir de Python 2.7 script; modifiez-le si nécessaire):
Il y a un certain nombre de commutateur, comme des instructions que vous pourrait ajouter plus universelles ou de manipuler des valeurs par défaut différentes.
J'ai aussi eu cette question et, pour moi, la meilleure solution est de définir une variable d'environnement dans mon IDE (PyCharm) et de vérifier si cette variable existe pour savoir si le script est exécuté soit via la ligne de commande ou via l'IDE.
Pour définir une variable d'environnement dans PyCharm vérifier:
Comment définir des variables d'environnement dans PyCharm?
Exemple de code (variable d'environnement: RUNNING_PYCHARM = True):
J'espère que cela fonctionne pour vous.