Как попасть в REPL (Read, Eval, Print, Loop) из кода Python
есть ли способ программно заставить скрипт Python упасть в REPL в произвольной точке его выполнения, даже если скрипт был запущен из командной строки?
Я пишу быструю и грязную программу построения графика, которую я хочу прочитать данные из stdin или файла, построить его, а затем перейти в REPL, чтобы разрешить настройку графика.
6 ответов:
вы можете попробовать использовать интерактивную опцию для python:
python -i program.py
это будет выполнять код в program.py, затем перейдите в REPL. Все, что вы определяете или импортируете на верхнем уровне program.py будут доступны.
Я часто использую этот:
def interact(): import code code.InteractiveConsole(locals=globals()).interact()
вот как вы должны это сделать (IPython > v0. 11):
import IPython IPython.embed()
для IPython
from IPython.Shell import IPShellEmbed ipshell = IPShellEmbed() ipshell() # this call anywhere in your program will start IPython
вы должны использовать IPython, Кадиллак Python REPLs. См http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython
из документации:
Он также может быть полезен в научной вычислительные ситуации, где это происходит общие нужно сделать некоторые автоматические, вычислительноемких часть и затем остановиться, чтобы посмотреть на данные, участки и т. д. Открытие экземпляра IPython даст вы получаете полный доступ к своим данным и функции, и вы можете возобновить программу выполнение после того, как вы закончите с интерактивная часть (возможно, чтобы остановить опять же позже, столько раз, сколько нужно).
вы можете запустить отладчик:
import pdb;pdb.set_trace()
Не уверен, что вы хотите REPL для, но отладчик очень похож.
чтобы использовать iPython и функциональность отладчика, вы должны использовать ipdb,
вы можете использовать его так же, как pdb, с добавлением :
import ipdb ipdb.set_trace()
Я только что сделал это в одном из моих собственных скриптов (он работает в рамках автоматизации, которая является огромным Пита для инструмента):
x = 0 # exit loop counter while x == 0: user_input = raw_input("Please enter a command, or press q to quit: ") if user_input[0] == "q": x = 1 else: try: print eval(user_input) except: print "I can't do that, Dave." continue
просто поместите это туда, где вы хотите точку останова, и вы можете проверить состояние, используя тот же синтаксис, что и интерпретатор python (хотя он, похоже, не позволяет вам импортировать модули). Это не очень элегантно, но это не требует каких-либо других настроек.