Запустить nano как подпроцесс из python, захватить ввод

Я пытаюсь запустить текстовый редактор (nano) изнутри Python, попросить пользователя ввести текст, а затем перехватить текст после его записи (Control-O). Я не работал с subprocess модуль раньше, ни трубы, так что я не знаю, что попробовать дальше.

Пока у меня есть этот код:

a = subprocess.Popen('nano', stdout=subprocess.PIPE, shell=True)

куда a должен захватить вывод. Этот код, однако, не вызывает nano, а вместо этого заставляет терминал python вести себя странно. Клавиши "вверх" и "вниз" (история) перестают работать, и клавиша возврата становится неработоспособной.

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

2 ответа

Решение

Control-O в Nano записывает данные в редактируемый файл, т. Е. Не в стандартный вывод, поэтому избегайте попытки перехватить стандартный вывод и просто прочитать файл, как только пользователь записывает его и выходит из Nano. Например, на моем Mac:

>>> import tempfile
>>> f = tempfile.NamedTemporaryFile(mode='w+t', delete=False)
>>> n = f.name
>>> f.close()
>>> import subprocess
>>> subprocess.call(['nano', n])

Здесь я пишу "Привет, мир!" затем нажмите control-O, верните control-X и:

0
>>> with open(n) as f: print f.read()
... 
Hello world!


>>> 

Я не уверен, что вы можете захватить то, что пользователь вошел в nano, В конце концов, это работа нано.

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

Просто создайте редактор, используя os.system, Ваш терминал ведет себя забавно, потому что nano - это полноэкранная программа, которая будет использовать escape-последовательности терминала (вероятно, через. Curses) для управления экраном и курсором. Если вы создадите его без привязки к терминалу, он будет плохо себя вести.

Кроме того, вы должны рассмотреть возможность открытия $EDITOR если это определено, а не нано. Это то, что люди ожидают.

Другие вопросы по тегам