перейти в интерпретатор Python во время выполнения функции

91

у меня есть модуль python с функцией:

def do_stuff(param1 = 'a'):
    if type(param1) == int:
        # enter python interpreter here
        do_something()
    else:
        do_something_else()

есть ли способ перейти в интерпретатор командной строки, где у меня есть комментарий? так что если я запустил в python следующее:

>>> import my_module
>>> do_stuff(1)

я получаю следующее приглашение в контексте и в том, где у меня есть комментарий do_stuff()?

aaronstacy
источник
Возможный дубликат входа в интерактивный режим в Python
Mad Physicist

Ответы:

61

Вставка

import pdb; pdb.set_trace()

войдет в отладчик Python в этот момент

См. Здесь: http://docs.python.org/library/pdb.html

престомация
источник
pdbотличный ванильный питон; если у вас есть место для добавления внешнего пакета, ipdbэто здорово - та же функциональность, что и отладчик, но с подсветкой синтаксиса, завершением табуляции и т. д. ipython
khstacking
Обновление - ipdbустарело, в настоящее время я использую pdbpp( pdb++) , который имеет аналогичные функции и работает с ним import pdb; pdb.set_trace()(то есть он исправляет этот импорт, поэтому это заменяемая замена)
driftcatcher
@hangtwenty: почему ты говоришь, что ipdbустарел? Я не могу найти никаких новостей об этом.
Ник Маттео,
@Kundor да, ты прав. Я отчетливо помню, как где-то читал, что авторы решили прекратить поддержку проекта и вместо этого указали на другой проект. Может быть, это случилось ненадолго, а потом воскресили? Я могу ошибаться! В любом случае, я наслаждался ipdbраньше, но наслаждаюсь pdbppс тех пор
driftcatcher
144

Если вам нужна стандартная интерактивная подсказка (вместо отладчика, как показывает предварительная установка), вы можете сделать это:

import code
code.interact(local=locals())

См .: модуль кода .

Если у вас установлен IPython и вместо этого вам нужна оболочка IPython, вы можете сделать это для IPython> = 0.11:

import IPython; IPython.embed()

или для более старых версий:

from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed()
ipshell(local_ns=locals())
Мэтт Андерсон
источник
27
для IPython> = 0.11 в IPython больше нет оболочки модуля ... поэтому запустите его, используя вместо этого "import IPython; IPython.embed ()".
Evandrix
Можно ли после входа продолжить code.interact(), а-ля PDB c(ontinue)?
Nick T
4
code.interact()это блокирующий звонок. Ваша программа остановится и дождется завершения. Если вы выйдете из интерактивного интерпретатора, ваша программа должна возобновиться с следующего оператора.
Мэтт Андерсон
1
В чем разница между интерактивной подсказкой и отладчиком?
StockB
1
@StockB Это стандартная интерактивная подсказка, которая делает его важным. Отладчик - это интерактивная подсказка, но это не то же самое. В PDB нельзя выполнять многострочные операторы, встроенная helpфункция переопределяется и т. Д.
kbrose
30

Если вам нужен интерпретатор Python по умолчанию, вы можете сделать

import code
code.interact(local=dict(globals(), **locals()))

Это позволит получить доступ как к локальным, так и к глобальным.

Если вы хотите использовать интерпретатор IPython, IPShellEmbedрешение устарело . В настоящее время работает:

from IPython import embed
embed()
Ронан Пайшао
источник
8
спасибо, code.interact(local=dict(globals(), **locals()))это намного лучше, чем code.interact(local=locals())потому, что последний заставляет вас повторно импортировать пакеты
s2t2
Этот ответ сработал для меня лучше, так как я использовал сценарий bash для вызова моего кода Python. Я не мог взаимодействовать с моим кодом Python, используя принятый ответ. Благодаря!
jonathanking