2009-07-31 23 views
6

Czy istnieje sposób, aby skrypt Pythona automatycznie wykrywał, czy jest uruchamiany interaktywnie czy nie? Alternatywnie, czy można wykryć, czy ipython jest używany w porównaniu do zwykłego pliku wykonywalnego C python?Wykrywanie, kiedy skrypt Pythona jest uruchamiany interaktywnie w ipython

Tło: Moje skrypty python zwykle zawierają wywołanie funkcji exit(). Od czasu do czasu uruchamiam skrypty interaktywnie w celu debugowania i profilowania, zwykle w ipythonie. Kiedy uruchamiam interaktywnie, chcę zablokować wywołania, aby wyjść.

Wyjaśnienie:

Załóżmy, że mam skrypt, myscript.py, który wygląda następująco:

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

Czasami chcę, aby uruchomić skrypt w sesji ipython że już rozpoczął , mówiąc coś w stylu:

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

na końcu skryptu, wyjście() wywołanie spowoduje ipython powiesić podczas gdy on sks mnie, jeśli naprawdę chcę wyjść. Jest to niewielka irytacja podczas debugowania (zbyt małe, aby mnie obchodziło), ale może to zepsuć wyniki profilowania: wiersz wyjścia zostaje włączony do wyników profilu (co utrudnia analizę, jeśli rozpocznę sesję profilowania przed wyjściem na lunch) .

Co chciałbym to coś, co pozwala mi zmodyfikować mój skrypt wygląda tak:

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

Odpowiedz

13

i stumbed na następujących i wydaje rade dla mnie:

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

co ze standardową powłoką interaktywną otrzymaną za pomocą 'pythona'? – n611x007

2

Wywołany interaktywnie, Python będzie uruchomić skrypt w $ PYTHONSTARTUP, więc może po prostu mieć tę zmienną środowiskową wywołać skrypt, który ustawia globalny

3

Docs powiedzieć, że sys.ps1 nie istnieje w trybie nieinteraktywnym. Dodatkowo można użyć sys.flags (dla Pythona 2.6+), aby wykryć, czy użyliśmy python -i <whatever>.

Skrypt ten wykrywa, czy możemy uruchomić interaktywnie, nieinteraktywnie, w trybie post-mortem (które mogą być przypisane do trybu interaktywnego jeśli interpreter Pythona jest wywoływana za pomocą python -i niejawnie i użytkownik uważa, że ​​wylądował na „interaktywny” konsoli):

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

Obsługa IPython może być dodana zgodnie z opisem Foopsa.

+0

To jest złe w konsoli PyCharm. –

Powiązane problemy