Frage

Gibt es eine Möglichkeit für einen Python-Skript automatisch zu erkennen, ob es sich interaktiv oder nicht ausgeführt wird? Alternativ kann man erkennen, ob ipython im Vergleich zu dem regulären c Python-Executable verwendet wird?

Hintergrund: Mein Python-Skripte hat in der Regel einen Anruf () in sich zu verlassen. Von Zeit zu Zeit betreibe ich die Skripte interaktiv für das Debuggen und Profilieren, in der Regel in ipython. Wenn ich interaktiv renne, ich will die Anrufe Ausgang zu unterdrücken.

Klarstellung :

Angenommen habe ich ein Skript, myscript.py, die wie folgt aussieht:

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

Manchmal möchte ich das Skript innerhalb einer IPython Sitzung ausgeführt, die ich bereits begonnen haben, etwas sagen wie:

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

Am Ende des Skripts wird der Ausgang () -Aufruf verursacht ipython zu hängen, während er mich fragt, ob ich wirklich beenden will. Dies ist ein kleines Ärgernis während des Debuggens (zu gering für mich zu kümmern), aber es kann Profilierungs Ergebnisse mess up: die Austrittsaufforderung wird in den Profil-Ergebnisse (so dass die Analyse schwieriger, wenn ich eine Profilerstellungssitzung, bevor sie zum Mittagessen beginnen) inbegriffen .

Was ich möchte, ist etwas, das ich mein Skript ändern kann, so dass es wie folgt aussieht:

#!/usr/bin/python
...do useful stuff...
if is_python_running_interactively():
    print "The exit_status was %d" % (exit_status,)
else:
    exit(exit_status)
War es hilfreich?

Lösung

Ich stolperte über die folgenden, und es scheint, den Trick für mich zu tun:

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

Andere Tipps

Docs sagen, dass sys.ps1 nicht im nicht interaktiven Modus existiert. Zusätzlich kann man sys.flags (für Python 2.6+) verwenden, um festzustellen, ob wir python -i <whatever> verwendet haben.

Diese Skripte erkennt, wenn wir interaktiv, nicht interaktiv ausgeführt, und in post-mortem-Modus (die in dem interaktiven Modus zurückgeführt werden können, wenn Python-Interpreter aufgerufen wird python -i implizit und Benutzer denkt, dass er in „interaktiv“ Konsole gelandet):

#!/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.")

IPython Unterstützung hinzugefügt werden kann, wie sie von Herrn Fooz beschrieben.

Wenn interaktiv aufgerufen, Python wird das Skript in $ PYTHON laufen, so könnte man einfach, dass die Umgebungsvariable ein Skript aufrufen haben, die eine globale setzt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top