Question

Existe-t-il un moyen pour un script python de détecter automatiquement s'il est exécuté de manière interactive ou non? Sinon, peut-on détecter si ipython est utilisé par rapport à l’exécutable standard c python?

Arrière-plan: Mes scripts python ont généralement un appel à exit (). De temps en temps, je lance les scripts de manière interactive pour le débogage et le profilage, généralement sous ipython. Lorsque je cours en mode interactif, je souhaite supprimer les appels à quitter.

Clarification :

Supposons que j'ai un script, myscript.py, qui ressemble à:

#!/usr/bin/python
...do useful stuff...
exit(exit_status)

Parfois, je souhaite exécuter le script dans une session IPython que j'ai déjà commencée, en disant par exemple:

In [nnn]: %run -p -D myscript.pstats myscript.py

À la fin du script, l'appel de exit () fera bloquer ipython tant qu'il me demandera si je souhaite vraiment quitter. Ceci est une gêne mineure pendant le débogage (trop mineur pour que je puisse m'en occuper), mais cela peut gâcher les résultats du profilage: l'invite de sortie est incluse dans les résultats du profil (ce qui rend l'analyse plus difficile si je commence une session de profilage avant de déjeuner). .

Ce que j'aimerais, c'est quelque chose qui me permet de modifier mon script pour qu'il ressemble à:

#!/usr/bin/python
...do useful stuff...
if is_python_running_interactively():
    print "The exit_status was %d" % (exit_status,)
else:
    exit(exit_status)
Était-ce utile?

La solution

Je suis tombé sur ce qui suit et il semble que le truc me convient:

def in_ipython():
    try:
        __IPYTHON__
    except NameError:
        return False
    else:
        return True

Autres conseils

La documentation indique que sys.ps1 n'existe pas en mode non interactif. De plus, on peut utiliser sys.flags (pour Python 2.6+) pour détecter si nous avons utilisé python -i <whatever>.

Ce script détecte si nous exécutons de manière interactive, non interactive et en mode post-mortem (ce qui peut être attribué au mode interactif si l'interpréteur python est appelé de manière implicite avec python -i et que l'utilisateur pense avoir atterri dans " & console interactive):

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys

# IPython recognition is missing; test here if __IPYTHON__ exists, etc.

if hasattr(sys, 'ps1'):
    print("Running interactively.")
else:
    print("Not running interactively...")
    if sys.flags.interactive:
        print("... but I'm in interactive postmortem mode.")

Le support IPython peut être ajouté comme décrit par M. Fooz.

Lorsqu’il est appelé de manière interactive, python exécute le script dans $ PYTHONSTARTUP afin que vous puissiez simplement demander à cette variable d’environnement d’appeler un script définissant un paramètre global

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top