Работа с ругательствами в 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 allow curses.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-кодами.

Ответы на вопрос(2)

Ваш ответ на вопрос