2014-02-14 1 views
3

Я программист Perl, изучающий Python. Я пишу свой код в отладке emacs с помощью python -m pdb script.py с использованием Python 2.7.3.

Я хотел бы знать, что представляет собой эквивалент python в Perl, добавляющий $DB::single=1;1; к определенной строке кода python, так что при запуске отладчика он остановится там, даже если это другой файл исходного кода, откуда начало выполнения (например, строка кода в библиотеке, используемая script.py).

Любые идеи?

EDITED: после просмотра pdb.set_trace() или ipdb.set_trace(), я считаю их хорошими решениями, но не на 100% идентичными поведению $DB::single=1;1;. Это, я бы хотел, чтобы точка останова была на линии set_trace, а не на следующей строке. Это выполняется в Perl's $DB::single=1; путем добавления другого оператора в той же строке: 1;, что делает его $DB::single=1;1;.

Используя set_trace(), я получаю точку останова в строке после утверждения, даже если я добавлю после этого 1;. Все еще не полностью понимает, как Python рассматривает строки с несколькими операторами по сравнению с Perl.

Кто-нибудь?

enter image description here

Любые идеи?

+0

Привет, вы пытались установить точку останова с помощью 'C-x SPACE' (в буфере python), обратите внимание, что вам нужно будет работать pdb для этого. –

+1

Почему имеет значение, что точка останова находится на следующей строке? Почему функциональность должна быть идентичной функции Perl? – jpkotta

+0

jpkotta, он косметический, но я хочу статическую точку останова, которая фактически заставляет отладчик останавливаться там, а не на следующем утверждении. Например, если у вас есть комментарии на 1000 строк до следующего утверждения, расстояние между точкой останова и следующим утверждением раздражает. – 719016

ответ

2

Python поставляется с отладчиком под названием pdb. Для того, чтобы остановить скрипт в данный момент в коде поместить следующее

import pdb; pdb.set_trace() 

Поскольку вы используете Emacs, вы можете попробовать команду pdb представленной gud.el (коррекцией: Вам не нужно поджать " python-mode 'для запуска pdb, спасибо @Andreas Röhler за исправление). Начните его с pdb name_of_script.py, затем вы можете установить контрольную точку из emacs, нажав C-xSPACE на линии, на которой вы хотите установить точку останова на.Я рекомендую вам использовать menu-bar для изучения команд, предоставляемых отладчиком (GUD). Вы также можете использовать обычные команды pdb в буфере *gud-pdb*, запущенном emacs.

+0

Чтобы быть точным: pdb не предоставляется python-mode, это интерактивная функция автозагрузки Lisp в 'gud.el '. Это означает: вы можете запускать программу из pdb в любое время, не требуется предварительная загрузка в режиме python. –

+0

Привет, @ AndreasRöhler благодарит за исправление –

6

Является ли следующее удовлетворение ваших потребностей?

import ipdb; ipdb.set_trace() 

просто написать где-нибудь в вашем коде и запустить скрипт с python script.py.

вам нужен IPython отладчик (ipython является расширенным интерпретатор Python):

pip install ipdb 

редактировать: вы знаете, что если вы запустите M-x pdb RET pdb myscript.py RET, вы будете иметь PDB подсказки и Emacs будет отслеживать исходный код в другом буфере, но он не останавливается там, где вы определили ipdb.set_trace()?

Виртуальный Env?

Если вы используете виртуальные envs, у вас есть несколько вариантов. Я рекомендую установить virtualenvwrapper из ELPA и запустить M-x venv-workon.

+0

Я использую 'M-x pdb RET python -m pdb myscript.py RET'. – 719016

Смежные вопросы