使用子进程使用nano编写并保存文件

时间:2014-08-10 10:14:40

标签: python subprocess nano

如何通过使用子进程调用nano来编写/附加到文件并自动保存。例如,我有一个文件,我想打开它并在其末尾添加一些东西,所以我写了

>>> import tempfile
>>> file = tempfile.NamedTemporaryFile(mode='a')
>>> example = file.name
>>> f.close()
>>> import subprocess
>>> subprocess.call(['nano', example])

现在一旦最后一行被执行,文件就会打开,我可以写任何东西,然后通过按Ctrl + O和Ctrl + X来保存它

相反,我希望我通过stdin PIPE发送输入,并且文件自己保存,即可以有任何机制自动按Ctrl + O和Ctrl + X?

可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

ctrl-O只是一个字符,与其他字符相同。您可以通过编写'\x0f'(或在Python 3中,b'\x0f')发送它。

然而,这可能对你没什么好处。大多数在终端中提供交互式GUI的程序,如nano,都不能由stdin驱动。他们需要控制终端,为此,他们要么检查stdin isatty然后tcsetattr,要么只是打开/dev/tty

您可以通过使用os.openptyos.forkptypty创建伪终端来解决此问题。

但是使用像pexpect这样的库来处理交互式程序,GUI或其他方式通常更容易。

首先不尝试推动交互式程序更容易。例如,与nano不同,ed旨在以"批处理模式"通过脚本,sed更是如此。

当您尝试做一些可以直接在Python中轻松完成的操作时,根本不会尝试驱动程序更容易。将某些内容附加到文件的最简单方法是open模式'a'write模式。new_line = input('What do you want to add?') with open(fname, 'a') as f: f.write(new_line) 。根本不需要外部程序。例如:

nano

如果您使用sudo的唯一原因是因为您需要sudo的某些内容......那真的没有理由。您可以轻松地sed其他任何内容,例如nano或其他Python脚本。使用{{1}}只会让事情变得更加困难。


这里的一个重要问题是:为什么你的Python脚本无法写入文件,但是你想让任意远程用户能够追加?这听起来像是一个非常糟糕的系统设计。您使文件不可写,因为您希望限制普通用户修改它们;如果您希望您的Python脚本能够代表您的远程用户对其进行修改,那么为什么它不是由该脚本运行的同一用户拥有?

答案 1 :(得分:0)

在(不太可能)的事件中你仍然发现你需要从Python进程控制 nano 或其他一些交互式程序,我会在这里建议同样的事情我建议用于这个问题:Using python subprocess.call() to launch an ncurses process ...

...不要使用子进程来控制curses /全屏交互式进程。使用 pexpect 。这就是它的用途。

(另一方面,我也同意这里有很多关于更好地解决权限问题的方法的评论。写一些脚本(在Python中, bash sed 或其他)可以在 sudo 下运行,可以直接对数据文件进行就地编辑或附录。