如何通过使用子进程调用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?
可以帮我解决这个问题吗?
答案 0 :(得分:1)
ctrl-O只是一个字符,与其他字符相同。您可以通过编写'\x0f'
(或在Python 3中,b'\x0f'
)发送它。
然而,这可能对你没什么好处。大多数在终端中提供交互式GUI的程序,如nano
,都不能由stdin驱动。他们需要控制终端,为此,他们要么检查stdin isatty
然后tcsetattr
,要么只是打开/dev/tty
,
您可以通过使用os.openpty
,os.forkpty
或pty
创建伪终端来解决此问题。
但是使用像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 下运行,可以直接对数据文件进行就地编辑或附录。