Как попасть в REPL (Read, Eval, Print, Loop) из кода Python


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

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

6 96

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