0

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

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

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

相反,我希望我通过标准输入管道发送输入,并且文件自己保存,即可能有任何机制自动点击 Ctrl+O 和 Ctrl+X 吗?

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

4

2 回答 2

1

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

但是,这可能对您没有任何好处。大多数在终端中提供交互式 GUI 的程序,例如nano,不能由标准输入驱动。他们需要控制终端,为此,他们将检查该标准输入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,或其他 Python 脚本——同样容易。使用nano只是无缘无故地让自己变得更难。


这里最大的问题是:为什么你有一个 Python 脚本不可写的文件,但你希望任意远程用户能够附加到该文件?这听起来像是一个非常糟糕的系统设计。您使文件不可写,因为您想限制普通用户修改它们;如果您希望您的 Python 脚本能够代表您的远程用户修改它,为什么它不属于运行该脚本的同一用户?

于 2014-08-10T10:25:01.423 回答
0

在(不太可能的)事件中,您仍然发现需要从 Python 进程控制nano或其他一些交互式程序,我将在这里建议与我针对这个问题建议的相同的事情:Using python subprocess.call()启动 ncurses 进程...

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

(另一方面,我也同意这里关于解决权限问题的更好方法的许多评论。编写某种可以在sudo下运行并且可以在- 直接将编辑或附录添加到您的数据文件中。

于 2014-08-10T11:50:12.643 回答