2010-06-19 66 views
3

我试图从Python内部启动文本编辑器(nano),让用户输入文本,然后在他们写出(Control-O)时捕获文本。我之前没有使用subprocess模块,也没有使用管道,所以我不知道接下来要做什么。启动nano作为python的子进程,捕获输入

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

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

a应该捕获输出。然而,这段代码并没有提出nano,反而使得python终端的表现很奇怪。上下键(历史记录)停止工作,退格键不起作用。

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

回答

6

控制-O纳米写入正在编辑文件,即到标准输出 - 所以,放弃尝试获取标准输出,只是读取文件,一旦用户写出来,并退出纳米。例如,在我的Mac上:

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

在这里,我写了“Hello world!”然后打控制-O返回控制-X和:

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


>>> 
+0

完美,谢谢! – alecwh 2010-06-19 19:44:52

+0

@alecwh,不客气! – 2010-06-19 19:59:42

3

我不知道,你可以捕捉什么样的用户已经进入nano。毕竟,这是纳米的工作。

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

只需使用os.system生成编辑器。你的终端表现得有趣,因为nano是一个全屏程序,并且将使用终端转义序列(可能通过。curses)来操纵屏幕和光标。如果你将它独立于终端产生,它将会变得不合时宜。

此外,您应该考虑打开$EDITOR,如果它被定义而不是纳米。这就是人们所期望的。

相关问题