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

Есть ли способ интерактивно запрограммировать приложение Curses на Python?

Есть ли способ создать второй терминал, чтобы на него работали все вызовы функций curses, а не в существующий терминал? Я работаю намного быстрее, когда я могу попробовать все в интерактивном режиме, поэтому я хотел бы иметь возможность запускать интерактивный интерпретатор python в одном терминале и видеть вывод curses в другом.

Как бы то ни было, вызов initscr() в интерактивном окне либо терпит неудачу (PyDev), либо навсегда удаляет обновление окна с хоста (Spyder) или вызывает странное поведение в консоли (IPython).

Можно ли использовать другой терминал с помощью setupterm()? Если да, где я могу получить другую строку TERM, чтобы позвонить ей?

4b9b3361

Ответ 1

Я не верю, что модуль curses в основном (полностью?) реализован на уровне C. Маловероятно, что он предоставит такие крючки, хотя, если вы знакомы с языком, это может стоить посмотреть через источник.

Однако, читая ваш вопрос, я подумал о другой технике, которую я использую в других контекстах. Вы можете сохранить script через другой терминал/редактор и использовать технику, похожую на команду dnotify (или даже простой опрос) для загрузки это в вашу программу запуска.

Еще одна идея - использовать сокеты для отправки команд и их выполнения. Конечно, это опасно для безопасности, поэтому принимайте необходимые меры предосторожности.

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

Ответ 2

Вы можете использовать code.InteractiveConsole и SocketServer для присоединения интерактивной оболочки python к сокету и выполнить свою разработку через это. Простой пример выглядит так:

import sys
import SocketServer
from code import InteractiveConsole

class InteractiveServer(SocketServer.BaseRequestHandler):
   def handle(self):
        file = self.request.makefile()
        shell = Shell(file)
        try:
           shell.interact()
        except SystemExit:
           pass


class Shell(InteractiveConsole):
    def __init__(self, file):
        self.file = sys.stdout = file
        InteractiveConsole.__init__(self)
        return

    def write(self, data):
       self.file.write(data)
       self.file.flush()

    def raw_input(self, prompt=""):
       self.write(prompt)
       return self.file.readline()

if __name__ == '__main__':
   HOST, PORT = "0.0.0.0", 9999

   server = SocketServer.TCPServer((HOST, PORT), InteractiveServer)
   server.serve_forever()

После этого вы можете подключиться к порту 9999 с другого терминала и выполнить свою задачу. Вы можете увидеть, как это работает в этом скриншоте (PNG)

Основы использования InteractiveConsole были взяты из этого сообщения. Я изменил его для работы с SocketServer для другого проекта, над которым я работал.

Ответ 3

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

Ну... для того, чтобы он работал, я думаю, что используемая архитектура будет "клиент-сервер".

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

Если ваша основная программа инициализирует сервер (на другом Python-процессе, из-за самой природы сервера), который отправляет вывод всем связанным с ним клиенту. Таким образом, вы можете визуализировать вывод функции на нескольких терминальных клиентах и ​​/или другом компьютере, который может подключаться к вашему серверу.

Это, на мой взгляд, намного проще, чем пытаться использовать пакет "curses". Но если единственная цель - получить представление о вашем коде, я думаю, что он слишком сложный (без добавленной стоимости).


У вас есть возможность сбросить вывод функции в текстовый файл (log.txt)