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