Как перейти к REPL (Read, Eval, Print, Loop) из кода Python

Есть ли способ программно заставить Python script отказаться от REPL в произвольной точке его выполнения, даже если script был запущен из командной строки?

Я пишу программу быстрой и грязной графики, которую я хочу читать данные из stdin или файла, зарисовывать ее, а затем переходить в REPL, чтобы можно было настроить график.

Ответ 1

Вы можете попробовать использовать интерактивную опцию для python:

python -i program.py

Это выполнит код в program.py, затем перейдите к REPL. Будет доступно все, что вы определите или импортируете на верхнем уровне program.py.

Ответ 2

Я часто использую это:

def interact():
    import code
    code.InteractiveConsole(locals=globals()).interact()

Ответ 3

Вот как это сделать (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 даст вы получаете полный доступ к своим данным и функции, и вы можете возобновить программу когда вы закончите с интерактивная часть (возможно, чтобы остановить снова позже, столько раз, сколько необходимо).

Ответ 4

Вы можете запустить отладчик:

import pdb;pdb.set_trace() 

Не уверен, для чего нужен REPL, но отладчик очень похож.

Ответ 5

Чтобы использовать iPython и функциональность отладчика, вы должны использовать ipdb,

Вы можете использовать его так же, как pdb, с добавлением:

import ipdb
ipdb.set_trace()

Ответ 6

Я только что сделал это в одном из своих собственных сценариев (он работает внутри рамки автоматизации, которая является огромной 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 (хотя, похоже, он не позволяет вам импортировать модуль). Он не очень элегантный, но он не требует никакой другой настройки.