потрапити в інтерпретатор python під час виконання функції


90

у мене є модуль 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()?


Можливий дублікат Enter Interactive Mode In 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

142

Якщо вам потрібна стандартна інтерактивна підказка (замість налагоджувача, як показано у попередній настройці), ви можете зробити це:

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, більше немає модуля Shell в IPython ... тому запустіть його, використовуючи "import IPython; IPython.embed ()" замість цього.
evandrix

Чи можна продовжувати після вступу code.interact(), а-ля PDB c(ontinue)?
Nick T

4
code.interact()блокуючий дзвінок. Ваша програма зупиниться і дочекається її закінчення. Якщо ви вийдете з інтерактивного інтерпретатора, ваша програма повинна продовжити роботу з твердженням, яке йде відразу після.
Метт Андерсон,

1
У чому різниця між інтерактивним підказкою та налагоджувачем?
StockB

1
@StockB Це стандартне інтерактивне підказка, яке робить це важливим. Налагоджувач - це інтерактивне підказка, але це не те саме. У PDB ви не можете робити багаторядкові оператори, вбудована helpфункція
замінена

28

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