Работа с ругательствами в IPython. Как я могу улучшить это?
Я нашел способ интерактивной работы с проклятиями, в то же время пользуясь большинством преимуществ IPython. Он работает с некоторыми ограничениями, но не так, как мне бы хотелось.
Исходная проблема, конечно, заключается в том, что я хотел бы иметь возможность работать с моим интерактивным сеансом Python, в то время как он управляет экраном терминала с использованием модуля curses (ncurses) (илиurwid, например). Одним из решений является создание простого TCP-сервера с простым циклом обработки событий, который оценивает каждую строку, которую он читает из сокета, и отправляет обратно сериализованные строки, представляющие и возвращающие результаты. Как описано здесь:SO: Есть ли способ интерактивно программировать приложение Python curses).
Вот несколько более простой прием (при условии, что у вас установлен IPython).
#!/usr/bin/python
#!/usr/bin/env python
from IPython import embed_kernel
import curses
def interact_with_curses(screen):
'''set global stdscr variable and run embedded IPython kernel
suitable to be called by curses.wrapper()
'''
global stdscr
stdscr = screen
embed_kernel()
if __name__ == '__main__':
curses.wrapper(interact_with_curses)
(слегка обманут, чтобы сделать подсветку синтаксиса SO счастливой).
Запуск этого приведет к выводу примерно так:
[IPKernelApp] To connect another client to this kernel, use:
[IPKernelApp] --existing kernel-2869.json
А переключаясь на другое окно или сеанс экрана вы можете запустить:
ipython console --existing kernel-2869.json
Чтобы подключиться к этому процессу и работать с ним.
Это достаточно мило. Затем вы можете называть такие вещи, какstdscr.refresh()
, Работа с объектами curses / window и pad, вызовdir()
на них, чтобы изучить их функциональность и вообще работать с кодом, как если бы вы были в обычном сеансе IPython, который, как оказалось, обновляет экран другого терминала и также читает с него (через функции ввода curses).
Проблемы с этим подходом и вопросы:
To exit it seems that I have to run quit() from the IPython console, and this doesn't exit the interpreter in the normal means. It doesn't seem to allowcurses.wrapper()
to reset the terminal and various attempts to called .endwin()
, .resetty()
(after having performed a .savetty()
of course), .reset_shell_mode()
(and .reset_prog_mode()
) and so on have all failed. I've tried calling them in main after the call to curses.wrapper()
and I've tried registering them with atexit
How do I cleanly quit from such a session?
[Tab] completion doesn't work
How do I get IPython's [Tab] completely working through an IPython console session to one of these embeded kernels?
Calling the IPython embed_kernel()
function prints the socket information to the curses screen, which is already initialized by the curses.wrapper()
by that time. This is ugly; also if want to do more interesting work, in curses and before calling the embed_kernel()
function then I can't see the text which was printed to stdout or stderr by that function.
How do I make embed_kernel()
silent and force it to register the connection details through some other mechanism? Can I give it my own socket name/path to use?
Я уверен, что подумаю над другими вопросами, но я надеюсь, что другие найдут этот трюк полезным и откроют для себя некоторые другие трюки, которые я могу использовать, когда хочу побороться с Python-кодами.