Ответ 1
import code
code.interact(local=locals())
Но использование отладчика Python, вероятно, больше того, что вы хотите:
import pdb
pdb.set_trace()
У меня часто бывает, что я буду писать script, и я доработаю часть script, где я хочу поиграть с некоторыми из переменных в интерактивном режиме. Для получения этой части требуется большая часть script, которую я уже написал.
В этом случае запустить эту программу изнутри оболочки не является тривиальным. Мне нужно было каким-то образом воссоздать условия этой функции.
То, что я хочу сделать, это вызвать функцию, например runshell()
, которая будет запускать оболочку python в этой точке программы, сохраняя все переменные в области видимости, позволяя мне соваться в ней.
Как я могу это сделать?
import code
code.interact(local=locals())
Но использование отладчика Python, вероятно, больше того, что вы хотите:
import pdb
pdb.set_trace()
На сегодняшний день самым удобным методом, который я нашел, является:
import IPython
IPython.embed()
Вы получаете все свои глобальные и локальные переменные и все удобства существ в IPython: завершение вкладки, автоматическое отступы и т.д.
Вы должны установить модуль IPython, чтобы использовать его, конечно:
pip install ipython
Вы можете использовать отладчик 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)
Для практичности я хотел бы добавить, что вы можете поместить трассировку отладчика в один лайнер:
import pdb; pdb.set_trace()
Какая хорошая строка для добавления в редактор, который поддерживает фрагменты, такие как TextMate или Vim + SnipMate. Я установил его для расширения "break" в вышеописанный лайнер.
Не совсем идеальный источник, но я написал несколько люков раньше, вот один, который я написал для проекта брошенных домашних животных 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