Есть ли способ интерактивно запрограммировать приложение Curses на Python?
Есть ли способ создать второй терминал, чтобы на него работали все вызовы функций curses
, а не в существующий терминал? Я работаю намного быстрее, когда я могу попробовать все в интерактивном режиме, поэтому я хотел бы иметь возможность запускать интерактивный интерпретатор python в одном терминале и видеть вывод curses в другом.
Как бы то ни было, вызов initscr()
в интерактивном окне либо терпит неудачу (PyDev), либо навсегда удаляет обновление окна с хоста (Spyder) или вызывает странное поведение в консоли (IPython).
Можно ли использовать другой терминал с помощью setupterm()
? Если да, где я могу получить другую строку TERM
, чтобы позвонить ей?
Ответы
Ответ 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)