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

4 投票
2 回答
3881 浏览
提问于 2025-04-16 00:11

我想在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!


>>> 

撰写回答