Запустить 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
если это определено, а не нано. Это то, что люди ожидают.