从Python启动nano作为子进程,并捕获输入
我想在Python里面启动一个文本编辑器(nano),让用户输入文本,然后在他们保存(按Control-O)后捕捉到这些文本。我之前没有使用过subprocess
模块,也不太懂管道,所以不知道接下来该怎么做。
到目前为止,我写了这段代码:
a = subprocess.Popen('nano', stdout=subprocess.PIPE, shell=True)
这里的a
应该用来捕捉输出。不过这段代码并没有打开nano,反而让Python的终端变得很奇怪。上下键(历史记录)不再工作,退格键也失灵了。
有没有人能给我指个方向,帮我解决这个问题?我意识到我可能需要了解一下Python中的管道,但我找到的资料只有pipes
模块,感觉帮助不大。
2 个回答
4
我不太确定你能否获取用户在 nano
中输入的内容。毕竟,这本来就是 nano 的工作。
你可以(而且我觉得应该)通过一个 临时文件 来获取用户在编辑器中的输入。用户输入完想要的内容后,保存并退出。然后你的程序就可以读取这个文件的内容,最后再把它删除。
只需使用 os.system
来启动编辑器。你的终端表现得有点奇怪,因为 nano 是一个全屏程序,会使用一些特殊的终端指令(可能是通过 curses 实现)来控制屏幕和光标。如果你在没有终端的情况下启动它,它就会出现问题。
另外,如果定义了 $EDITOR
,你应该考虑使用它,而不是直接用 nano。这样更符合用户的预期。
11
在Nano这个编辑器里,按下Control-O是用来保存你正在编辑的文件的,也就是说,它不会把内容输出到屏幕上。所以,不用试图去捕捉屏幕输出,等用户保存文件并退出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,接着按回车,再按Control-X,结果是:
0
>>> with open(n) as f: print f.read()
...
Hello world!
>>>