Как перейти в REPL (чтение, вычисление, печать, цикл) из кода Python

109

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

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

дсимча
источник

Ответы:

105

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

python -i program.py

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

Alex
источник
21
Когда вы будете готовы перейти на темную сторону, ipython -i program.py готов к работе.
joeforker
Впечатляюще и просто.
Nishant
127

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

def interact():
    import code
    code.InteractiveConsole(locals=globals()).interact()
Джейсон Р. Кумбс
источник
47
Вы можете сделать это еще проще: импортировать код; code.interact (local = locals ())
Стивен Крыскалла,
3
Внутри pdbвы можете использовать interact.
gerrit
43

Вот как это сделать (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 из Python REPL. См. Http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython

Из документации:

Это также может быть полезно в ситуациях научных вычислений, когда обычно необходимо выполнить некоторую автоматическую, вычислительно-интенсивную часть, а затем остановиться, чтобы посмотреть данные, графики и т. Д. Открытие экземпляра IPython предоставит вам полный доступ к вашим данным и функциям, и вы можете возобновить выполнение программы, как только вы закончите с интерактивной частью (возможно, чтобы снова остановиться позже, столько раз, сколько потребуется).

Joeforker
источник
3
IPython великолепен, но если OP хочет решение, которое использует только встроенный Python, решение Jason code.InteractiveConsole () - это то, как вы «должны» это делать. :-)
Бен Хойт
18

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

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

import ipdb
ipdb.set_trace()
Bluszcz
источник
17

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

import pdb;pdb.set_trace() 

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

Нед Батчелдер
источник
3
Я подозреваю, что он хотел бы внести живые изменения в работающий процесс в стиле Lisp.
Pinochle
1
Есть ли способ возобновить выполнение сценария, который запустил вас в pdb?
Джефф Веллинг
1
Я обычно пишу фрагмент кода в VIM с установкой Python, сохраняю его, а затем выполняю, например,! Python -i%. Или pdb. Это хороший вариант использования.
Nishant
0

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

бритва
источник