Як виконати багаторядкові оператори у власному відладчику Python (PDB)


157

Тому я запускаю скрипт Python, в межах якого я викликаю налагоджувач PDB Python, PDB, написавши:

import ipdb; ipdb.set_trace()

(Версія PDB версії iPython, хоча з цього питання я не думаю, що це має значення; я використовую лише для кольорового виводу).

Тепер, коли я дістаюся до налагоджувача, я хочу виконати багаторядковий оператор, такий як пункт if або цикл, але як тільки я набираю

if condition:

і натиснувши клавішу повернення, я отримую повідомлення про помилку *** SyntaxError: invalid syntax (<stdin>, line 1)

Як можна виконати багаторядкові оператори в PDB? Якщо це неможливо, чи існує спосіб цього все-таки виконати клавішу if або цикл?

Відповіді:


265

Ви можете зробити це під час роботи в pdb, щоб запустити тимчасовий інтерактивний сеанс Python з усіма доступними локальними змінними:

(pdb) !import code; code.interact(local=vars())
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

Закінчивши, використовуйте Ctrl-D для повернення до звичайного запиту pdb.

Просто не натискайте Ctrl-C, що припинить весь сеанс pdb.


46
Здається, те саме можна досягти, використовуючи команду pdb interact( як я дізнався з цього повідомлення про відслідковування помилок ).
Герріт

3
Чому це !потрібно в importзаяві?
Індрадхануш Гупта

19
Це, мабуть, не потрібно, але у мене є звичка префіксувати всі заяви Python в pdb !, щоб уникнути аварій. Наприклад, c = 42у pdb продовжуватиметься виконання замість присвоєння змінній c.
Маріус Гедмінас

8
@MariusGedminas - це найприємніше з PDB! Було б добре, якби їхні команди мали бути встановлені префіксами ...
Іан Кларк

Примітка: Ctrl-D, здається, є правильним способом виходу interactтакож, але він не дуже добре відповідає Spyder для мене.
Йосія Йодер

69

У python3 ipdbpdb) є команда під назвою interact . Його можна використовувати для:

Запустіть інтерактивний перекладач (використовуючи модуль коду ), глобальний простір імен якого містить усі (глобальні та локальні) імена, знайдені в поточній області.

Щоб скористатися ним, просто введіть interactу записі pdb. Крім усього іншого, це корисно для застосування коду, що охоплює кілька рядків, а також для уникнення випадкового запускання інших команд pdb.


2
Це дає мені "NameError: ім'я" взаємодія "не визначено", коли це роблять.
Джейсон

1
@jason версії 3.2 або новішої версії
vaer-k

2
Це пояснює. Я був у python 2.7.
Джейсон

Обережно це насправді кинуло помилку, що взаємодія не могла бути визначена, і вийшов із процесу
Camron_Godbout

1
Я думаю, що пропонувати уникати interactпропозиція занадто сильна. 90% це все, що мені колись потрібно, і це набагато простіше набратиfrom IPython import embed; embed()
vaer-k

43

Моя рекомендація - використовувати вбудовування IPython.

ipdb> from IPython import embed; embed()

2
Якщо у вас значення не визначено, помилка в розумінні списку, спробуйте використовувати з IPython import embed; embed(user_ns=locals()).
fx-kirin

1
для мене це працює набагато краще, ніж прийнята відповідь. Наприклад - це дозволяє правильно редагувати багаторядкові лінії - як, наприклад, повернути кілька рядків і щось виправити, тож вам не доведеться переписувати весь вираз з кількох рядків ... Я передаю місцеві жителі як @ fx-kirin запропонував.
ZeDuS

33

Всередині інтерпретатора або налагоджувача Python (2.7.1) (імпортувати pdb) можна виконати багаторядковий оператор із наступним синтаксисом.

for i in range(5): print("Hello"); print("World"); print(i)

Примітка. Коли я всередині інтерпретатора, я повинен двічі натиснути return, перш ніж код виконається. Всередині налагоджувача мені потрібно лише один раз натиснути повернення.


5
Це не дозволяє запускати щось глибше одного рівня.
Антоні Хетчкінс

7

Є особливий випадок, якщо ви хочете виконати пару команд при натисканні на точку розриву. Потім є команда налагодження commands. Це дозволяє вводити кілька рядків команд, а потім закінчувати всю послідовність endключовим словом. Більше с (pdb) help commands.


2

Я не знаю, чи можете ви це зробити, але це буде чудовою особливістю для ipdb. Ви, звичайно, можете використовувати розуміння списку та виконувати прості багаторядкові вирази, такі як:

if y == 3: print y; print y; print y;

Ви також можете заздалегідь записати деякі функції, щоб виконати все, що вам потрібно, що зазвичай займає кілька рядків.

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