从python启动nano作为子进程,捕获输入

时间:2010-06-19 18:49:46

标签: python pipe subprocess popen

我正在尝试从Python内部启动文本编辑器(nano),让用户输入文本,然后在写出时捕获文本(Control-O)。我之前没有使用subprocess模块,也没有管道,所以我不知道下一步该尝试什么。

到目前为止,我有这段代码:

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

a应捕获输出的位置。但是,这段代码并没有带来nano,而是让python终端表现得很奇怪。上下键(历史记录)停止工作,退格键变得不正常。

有人能指出我正确的方向来解决这个问题吗?我意识到我可能需要阅读Python中的管道,但我能找到的唯一信息是pipes模块,并没有多大帮助。

2 个答案:

答案 0 :(得分:6)

Nano中的Control-O写入正在编辑的文件,即到标准输出 - 所以,放弃尝试捕获stdout并只读取文件一旦用户将其写出并退出Nano。例如,在我的Mac上:

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

在这里,我写了“Hello world!”然后点击control-O Return control-X,并且:

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


>>> 

答案 1 :(得分:3)

我不确定您是否可以捕获用户输入的内容nano。毕竟,这是纳米的工作。

从编辑器获取用户输入你可以(我认为应该做的)是用temporary file生成它。然后当用户输入他想要的内容时,他会保存并退出。您的程序从文件中读取内容,然后将其删除。

使用os.system生成编辑器。您的终端表现得很有趣,因为nano是一个全屏程序,并将使用终端转义序列(可能通过.curses)操纵屏幕和光标。如果你将它连接到一个终端,那么它就会行为不端。

此外,如果定义了$EDITOR而不是nano,则应考虑打开{{1}}。这就是人们所期望的。