Ответ 1
Вы можете попробовать использовать интерактивную опцию для python:
python -i program.py
Это выполнит код в program.py, затем перейдите к REPL. Будет доступно все, что вы определите или импортируете на верхнем уровне program.py.
Есть ли способ программно заставить Python script отказаться от REPL в произвольной точке его выполнения, даже если script был запущен из командной строки?
Я пишу программу быстрой и грязной графики, которую я хочу читать данные из stdin или файла, зарисовывать ее, а затем переходить в REPL, чтобы можно было настроить график.
Вы можете попробовать использовать интерактивную опцию для 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 <= v0.11:
from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed()
ipshell() # this call anywhere in your program will start IPython
Вы должны использовать IPython, Cadillac из PPL REPL. См. 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()
Я только что сделал это в одном из своих собственных сценариев (он работает внутри рамки автоматизации, которая является огромной PITA для инструмента):
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 (хотя, похоже, он не позволяет вам импортировать модуль). Он не очень элегантный, но он не требует никакой другой настройки.