Czy istnieje sposób uruchomienia powłoki lub monitu IPython, gdy mój program uruchamia linię, która zgłasza wyjątek?Uruchamianie powłoki protokołu IPython na wyjątku
Najbardziej interesuje mnie kontekst, zmienne, w zakresie (i podskopach), w których wyjątek został podniesiony. Coś takiego jak debugowanie Visual Studio, gdy wyjątek jest rzucany, ale nie jest przechwytywany przez nikogo, Visual Studio zatrzyma się i da mi stos wywołań i zmienne obecne na każdym poziomie.
Czy sądzisz, że istnieje sposób na uzyskanie czegoś podobnego za pomocą IPython?
EDIT: Opcja -pdb
przy uruchamianiu ipython nie wydaje się robić to, co chcę (albo nie wiem jak go używać prawidłowo, co jest całkiem możliwe). I uruchom następujący skrypt:
def func():
z = 2
g = 'b'
raise NameError("This error will not be caught, but IPython still"
"won't summon pdb, and I won't be able to consult"
"the z or g variables.")
x = 1
y = 'a'
func()
Używając polecenia:
ipython -pdb exceptionTest.py
który zatrzymuje wykonanie gdy błąd zostanie podniesiony, ale przynosi mi wiersz ipython gdzie mam dostęp do zmiennych globalnych skryptu , ale nie lokalne zmienne funkcji func. pdb
jest wywoływane tylko wtedy, gdy bezpośrednio wpiszę polecenie w ipython, które powoduje błąd, tj. raise NameError("This, sent from the IPython prompt, will trigger pdb.")
.
Nie muszę koniecznie używać pdb
, chciałbym tylko mieć dostęp do zmiennych wewnątrz func
.
EDYTUJ 2: Minęło trochę czasu, opcja IPython's -pdb
działa teraz tak, jak tego chcę. Oznacza to, że gdy zgłoszę wyjątek, mogę cofnąć się w zakresie func
i bez problemu odczytać jego zmienne z
i g
. Nawet bez ustawienia opcji -pdb
, można uruchomić IPython w trybie interaktywnym, a następnie wywołać funkcję magiczną %debug
po wyjściu programu z błędem - spowoduje to również przejście do interaktywnego pytania ipdb z dostępem do wszystkich zakresów.
Podczas tego rodzaju hacki, należy pamiętać, że skrypt może zawiesić cokolwiek to nazywa, czy jest to część anoth er program. Moja sugestia polega na sprawdzeniu, czy sys.stdin.isatty() przed wykonaniem tego. – d33tah