【问题标题】:Linux commands in Python subprocessesPython 子进程中的 Linux 命令
【发布时间】:2015-10-08 20:07:17
【问题描述】:

我正在执行一组命令,首先需要我调用bash。我正在尝试通过编写 Python 脚本来自动执行这些命令。我的第一个命令显然需要bash,所以我运行

p = subprocess.call(['bash'])

它启动 bash shell 没问题。

然后我遇到的问题是尝试在 bash 环境中执行剩余的代码。我认为可能需要进程通信(即重定向标准输出,如

p0 = subprocess.Popen(cmd, stdout=subprocess.PIPE)
p1 = subprocess.Popen(['bash'], stdin=p0.stdout)
p1.communicate()

) 但管道似乎无法解决我的问题。

如何编写此脚本以模拟以下顺序 Linux 命令?

$ bash
$ cmd1
$ cmd2
...

我正在使用 Ubuntu 14.04 和 Python 2.7.6。

提前感谢您的指导!

【问题讨论】:

  • 这些命令有关系吗?它们是否需要在同一个 shell 会话中运行?它们是否需要在交互式 bash 会话下运行?
  • saltycrane.com/blog/2011/04/… 可能会有所帮助
  • @Busturdust 我实际上已经浏览过那个博客了——但是啊!我错过了可执行参数。这可能行得通!
  • @EtanReisner:这些命令都是相关的。一般来说,我要做的就是打开一个终端,执行bash,然后执行cmd1。然后打开另一个终端,执行bash再执行cmd2,以此类推。换句话说,每个命令运行一个进程,当我启动后续进程时,该进程必须在 bash 中运行
  • 那么我的问题的答案是“否”并且手动运行bash 仅在您的普通shell 不是 已经bash 我想。在这种情况下,您可能只想使用subprocess.call(或call_check 或该函数的任何更安全版本)命令bash -c cmd(或者如果实际上不需要手动bash,则只需cmd)。

标签: python linux bash process


【解决方案1】:
import subprocess

def bash_command(cmd):
    subprocess.Popen(cmd, shell=True, executable='/bin/bash')

bash_command('[your_command]')

【讨论】:

  • 这就是我要找的。谢谢!来自docs:“如果 shell=True,在 Unix 上,可执行参数指定默认 /bin/sh 的替换 shell”
【解决方案2】:

您不需要单独调用 run bash。你可以运行类似的东西:

p1 = subprocess.call(['cmd1'])
p2 = subprocess.call(['cmd2'])

如果由于某种原因必须运行 bash(例如,命令包含 bash 语句),您可以从 subprocess.call() 运行 bash -c "cmd1; cmd2"

编辑:正如 Busturdust 指出的那样,您也可以尝试设置shell=True,但它使用的是 sh,而不是 bash。但这对你来说可能就足够了。

【讨论】:

  • 其实我觉得关键不是shell参数,而是可执行参数。来自文档:“在带有 shell=True 的 Unix 上,shell 默认为 /bin/sh”,因此更改可执行参数会更改 shell
  • @marcman:我的意思是默认值。更改可执行文件确实会更改 shell,但我通常发现直接将 shell 指定为命令的一部分更直接 - 在极少数情况下我需要更改它。
  • 明白了。有什么特别的原因,还是只是个人选择?也就是说,这是一个标准约定吗?
  • 更多的是个人选择。我(和其他阅读代码的人)可以准确地看到正在运行的命令,而无需查看文档以了解可执行参数的含义。当然,你可以选择任何你觉得更舒服的东西。
  • 我明白了。感谢您的帮助!
猜你喜欢
  • 2021-12-10
  • 2015-12-19
  • 2022-10-19
  • 2018-02-19
  • 1970-01-01
  • 2014-08-06
  • 2019-02-28
  • 2017-01-09
  • 2020-11-26
相关资源
最近更新 更多