python - 当我在 Bash 中有一系列命令时,如何重定向标准输入/标准输出?

标签 python bash pipe subprocess

我目前正在执行一个 Bash 命令(通过 Python 的 subprocess.Popen),它正在从 stdin 读取,执行一些操作并输出到 stdout。类似的东西:

pid = subprocess.Popen( ["-c", "cmd1 | cmd2"],
                       stdin = subprocess.PIPE, 
                       stdout = subprocess.PIPE, 
                       shell =True )
output_data = pid.communicate( "input data\n" )

现在,我想做的是将其更改为在同一个子 shell 中执行另一个命令,该命令将在下一个命令执行之前改变状态,因此我的 shell 命令行现在(概念上)是:

cmd0; cmd1 | cmd2

在这种情况下,有什么方法可以将输入发送到 cmd1 而不是 cmd0 吗?我假设输出将包括 cmd0 的输出(将为空),然后是 cmd2 的输出。

cmd0 实际上不应该从 stdin 读取任何内容,这在这种情况下有什么不同吗?

我知道这可能只是一种愚蠢的做法,我试图在 cmd0 中打补丁,而不会对其他代码做太大的改动。也就是说,如果有更简洁的方法来解决这个问题,我愿意接受建议。

最佳答案

在子 shell 中执行 cmd0cmd1 并将 /dev/null 重定向为 cmd0 的 stdin:

(cmd0 </dev/null; cmd1) | cmd2

关于python - 当我在 Bash 中有一系列命令时,如何重定向标准输入/标准输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2650759/

相关文章:

mysql - bash循环mysql输出多个变量

python - 在 Linux 中管道 numpy 数据?

c - 管道上的 EOF 正在打印垃圾

python - 继承不继承,是否有动态创建指向其他类变量的属性?

python bokeh 在服务器端或客户端运行

bash - 是否可以将 getopts 与位置参数混合使用?

Bash - 在脚本中记录所有命令和退出代码

python - 为什么在 Python 中使用 os.setsid()?

python - 检查 Makefile 中是否存在 conda 环境

bash - 为什么从文件中获取标准输入与通过管道接收标准输入不同?