Як потрапити в REPL (Read, Eval, Print, Loop) з коду Python


108

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

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

Відповіді:


104

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

python -i program.py

Це виконає код у program.py, після чого перейдіть до REPL. Буде доступно все, що ви визначаєте чи імпортуєте на найвищому рівні program.py.


21
Коли ви будете готові перейти на темну сторону, ipython -i program.py є для вас.
joeforker

Вражаючий і простий.
Нішант

126

Я часто використовую це:

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

47
Ви можете зробити це навіть простіше, ніж це: імпортувати код; code.interact (local = localals ())
Стівен Крискалла

3
Всередині pdbможна використовувати interact.
Герріт

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 REPLs. Дивіться http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython

З документації:

Це також може бути корисним у наукових обчислювальних ситуаціях, коли звичайно потрібно робити якусь автоматичну, обчислювально-інтенсивну частину, а потім зупинятися на перегляді даних, графіків тощо. Відкриття примірника IPython надасть вам повний доступ до своїх даних та функцій, і ви можете відновити виконання програми, як тільки ви закінчите інтерактивну частину (можливо, щоб зупинити її знову пізніше, стільки разів, скільки потрібно).


3
IPython чудовий, але якщо ОП хоче рішення, яке використовує лише вбудований Python, Jason's code.InteractiveConsole () рішення - це як ви повинні це зробити. :-)
Бен Хойт

18

Щоб скористатися iPython та функціоналом налагоджувача, слід скористатися ipdb ,

Ви можете використовувати його так само, як pdb, з додаванням:

import ipdb
ipdb.set_trace()

17

Ви можете запустити налагоджувач:

import pdb;pdb.set_trace() 

Не впевнений, для чого ви хочете відповідати, але налагоджувач дуже схожий.


3
Я б підозрював, що він хотів би внести живі зміни до запущеного процесу, à la Lisp.
Пінокле

1
Чи є можливість відновити виконання сценарію, який запустив вас у pdb?
Джефф Веллінг

1
Я схильний писати фрагмент коду у VIM, встановленому Python, зберегти його, а потім зробити! Python -i%, наприклад. Або pdb. Це хороший випадок використання.
Нішант

0

Я щойно зробив це в одному зі своїх власних сценаріїв (він працює в рамках автоматизації, який є величезним ПІТА на інструмент):

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.