【问题标题】:Write and save a file with nano using subprocess使用子进程使用 nano 写入和保存文件
【发布时间】:2014-08-10 10:14:40
【问题描述】:

如何通过使用 subprocess 调用 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?

能帮我解决这个问题吗?

【问题讨论】:

  • 你想在这里实现什么,将文件读入程序,然后写入,然后再次写入文件不是更好。
  • 首先,为什么要使用nano?
  • 我想通过远程获取用户输入来附加文件,所以如果除了 naon 之外还有什么其他的建议。
  • @saurabh:运行nano 如何帮助您获得权限?因为你sudo吗?如果是这样,你为什么不能 sudo 另一个 Python 脚本?还是sed 或其他比nano 更简单的工具?
  • @saurabh:先运行['sudo'],然后运行['nano'],不会有任何帮助。你必须运行['sudo', 'nano']。如果你可以为nano 做同样的事情,你可以为sed 或python 做同样的事情。

标签: python subprocess nano


【解决方案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 中轻松完成的事情时,根本不尝试驱动程序会更容易。将某些内容附加到文件的最简单方法是在 'a' 模式下将其添加到 open 并将 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 脚本能够代表您的远程用户修改它,为什么它不属于运行该脚本的同一用户?

【讨论】:

  • 我需要通过远程获取用户的输入来附加一些文本值,并将这些值附加到需要 root 权限的文件中,因此我将使用 subprocess 模块,因此直接调用 open() 不起作用。那么如何实现呢?
  • 你使用 sudo 运行你的主进程 - 然后 open 将工作 - 生成另一个运行编辑器的进程只是为了向文件写入几行是矫枉过正的。
【解决方案2】:

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

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

(另一方面,我也同意这里的许多 cmets 关于解决权限问题的更好方法。编写某种脚本(在 Python 中,bash,sed em> 或其他)可以在 sudo 下运行,并且可以直接对您的数据文件进行就地编辑或附加。

【讨论】:

    猜你喜欢
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    相关资源
    最近更新 更多