Подтвердить что ты не робот

Python: запустить интерактивную оболочку python из программы

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

В этом случае запустить эту программу изнутри оболочки не является тривиальным. Мне нужно было каким-то образом воссоздать условия этой функции.

То, что я хочу сделать, это вызвать функцию, например runshell(), которая будет запускать оболочку python в этой точке программы, сохраняя все переменные в области видимости, позволяя мне соваться в ней.

Как я могу это сделать?

4b9b3361

Ответ 1

import code

code.interact(local=locals())

Но использование отладчика Python, вероятно, больше того, что вы хотите:

import pdb

pdb.set_trace()

Ответ 2

На сегодняшний день самым удобным методом, который я нашел, является:

import IPython
IPython.embed()

Вы получаете все свои глобальные и локальные переменные и все удобства существ в IPython: завершение вкладки, автоматическое отступы и т.д.

Вы должны установить модуль IPython, чтобы использовать его, конечно:

pip install ipython

Ответ 3

Вы можете использовать отладчик python (pdb) set_trace.

Например, если вы вызываете script следующим образом:

def whatever():
    x = 3
    import pdb
    pdb.set_trace()

if __name__ == '__main__':
    whatever()

Вы получаете область действия в точке, когда вызывается set_trace:

$ python ~/test/test.py
--Return--
> /home/jterrace/test/test.py(52)whatever()->None
-> pdb.set_trace()
(Pdb) x
3
(Pdb) 

Ответ 4

Для практичности я хотел бы добавить, что вы можете поместить трассировку отладчика в один лайнер:

import pdb; pdb.set_trace()

Какая хорошая строка для добавления в редактор, который поддерживает фрагменты, такие как TextMate или Vim + SnipMate. Я установил его для расширения "break" в вышеописанный лайнер.

Ответ 5

Не совсем идеальный источник, но я написал несколько люков раньше, вот один, который я написал для проекта брошенных домашних животных http://code.google.com/p/devdave/source/browse/pymethius/trunk/webmud/handlers/konsole.py

И вот один из Twisted Library http://twistedmatrix.com/trac/browser/tags/releases/twisted-8.1.0/twisted/manhole/telnet.py, консольная логика находится в Shell.doCommand