Python эквивалент стопа IDL и .reset - PullRequest
8 голосов
/ 24 января 2010

Я относительно новичок в Python, но у меня небольшой опыт использования IDL. Мне было интересно, знает ли кто-нибудь, есть ли в python эквивалентные команды для команд stop и .reset IDL.

Если я запускаю какой-то IDL-скрипт, я написал, что ввел команду stop, по сути, он останавливает скрипт и дает мне доступ к командной строке в середине скрипта. Так что у меня есть доступ ко всем функциям и переменным, которые я определил перед командой stop, что я считаю действительно полезным для отладки.

Команда .reset мне тоже очень полезна. Он сбрасывает среду IDL (очищает все переменные, функции и т. Д.). Это как если бы я закрыл этот сеанс и открыл новый, но без необходимости выходить и перезапускать IDL. Я обнаружил, что если я пытаюсь отладить сценарий, который я написал, иногда полезно начинать с нуля и не нужно сбрасывать IDL (или python сейчас). Также было бы полезно в python отменить импорт всех ранее импортированных модулей.

Любая помощь по этим вопросам будет принята с благодарностью.

Приветствия

Относящиеся

Ответы [ 8 ]

3 голосов
/ 08 февраля 2010

IPython (кроме того, что REPL намного лучше, чем стандартный интерпретатор python) может делать то, что вы хотите:

from IPython.Shell import IPShellEmbed

start_shell = IPShellEmbed()

def times_2(x):
    return 2*x

a = 5

start_shell()

# now in IPython shell
# a -> 5
# times_2(a) -> 10

Обратите внимание, что любые изменения, внесенные в оболочку , не будут отправлены обратно в основной процесс Python при выходе - если вы установите = 10 в IPython (используя приведенный выше пример), значение a все равно до 5 в основном процессе Python.

edit: запись в списке рассылки пользователей IPython , где я впервые увидел эту технику.

1 голос
/ 07 апреля 2017

Обновление до отредактированного решения . Интерактивный IPython намного мощнее и удобнее, чем pdb.set_trace.

Попробуйте этот скрипт

from IPython import embed
a = 1
b = 2
print('before')

embed()

print('after')
c = 3

Поместите embed() туда, где вы хотите прервать. Запустив скрипт, вы войдете в интерактивную оболочку IPython, вы сможете просматривать и изменять переменные. Сценарий продолжится после выхода из оболочки.

1 голос
/ 03 марта 2016

pdb.set_trace() нарушение кода, по-видимому, не позволяет вам ".continue" (команда IDL) с этой точки (с http://pythondammit.blogspot.fr/2012/04/equivalent-of-idls-stop-command.html)

1 голос
/ 29 августа 2014

Вы можете сделать %reset из оболочки IPython.

Для остановок просто добавьте точки останова pydebug, как упомянуто

1 голос
/ 23 мая 2010

Используйте pdb, как в этом коротком скрипте. Запустите его из командной строки, и волшебным образом появится приглашение PDB, позволяющее выполнить пошаговое выполнение, вычисление произвольных выражений и т. Д.

#!/usr/bin/env  python
import pdb;

print 1
print 2
pdb.set_trace()
print 3
print 4
1 голос
/ 29 января 2010

stop звучит эквивалентно использованию модуля code. .reset не имеет эквивалента в Python, кроме безвозмездного использования del.

0 голосов
/ 29 января 2010

Добро пожаловать в сообщество Python! Я все еще учусь, но imo Python лучше, чем Interactive Data Language.

В любом случае, ответ Игнасио об использовании модуля кода выглядит так, как будто он может дать то, что вы хотите, по крайней мере, даже до остановки IDL.

Еще одна полезная вещь - перейти в интерактивный режим Python и импортировать вашу программу. Затем вы можете взаимодействовать с ним, выполняя функции и т. Д. (Правда, я не эксперт в этом.) Если вы сделаете это, вам понадобится функция main () в файле, который управляет программой. Например, у вас будет что-то вроде:

import sys
def main():
    # do stuff
    return(0)

if __name__ == '__main__':
    sys.exit(main())

вместо просто:

# do stuff

Это предотвращает выполнение программы, когда вы извлекаете ее в интерпретатор Python. Подробнее см. статью Гвидо об основных функциях .

0 голосов
/ 24 января 2010

Вы, вероятно, просто хотите использовать для этого отладчик Python.

...