【问题标题】:Subprocess: calling a program with two input redirects子进程:调用具有两个输入重定向的程序
【发布时间】:2020-08-14 19:11:57
【问题描述】:

我正在尝试运行以下命令,其中 AAABBB 是包含一堆多行数据的 Python 变量。

我宁愿不要通过将变量写入磁盘来减慢自己的速度。看来subprocess.Popen 应该以某种方式支持这一点。

diff <(echo AAA) <(echo BBB)

我知道这在 shell 级别上的工作方式有一个微妙之处,我没有掌握,这可能会让这变得轻而易举。

如何在 Python 中调用一个 shell 可执行文件,使用子进程,并带有两个包含 Python 变量的输入重定向?

【问题讨论】:

  • Popen() 的返回值有一个stdin 属性(假设您在创建对象时传递了stdin=PIPE)。在此调用 .write() 两次,将您的 AAABBB 值传递给它。
  • 您是否尝试从 Python 调用 diff?或者您是否尝试将两个 Python 脚本的输出输入到 shell 中的 diff 中?我不太明白你想做什么。
  • &lt;(echo AAA) 是进程替换,而不是重定向。 Bash 异步运行 echo AAA 并将其标准输出重定向到 FIFO,然后将 &lt;(echo AAA) 替换为 FIFO 的路径。运行set -x; diff &lt;(echo AAA) &lt;(echo BBB),你会看到实际执行的命令类似于diff /dev/fd/63 /dev/fd/62
  • 我猜你可以在 Python 中使用 FIFO 做同样的事情。
  • 如果您想使用 Python 获得差异,您是否尝试使用 difflib

标签: python bash subprocess io-redirection


【解决方案1】:

这能达到你想要的吗?

import os
import subprocess

os.environ['aaa'] = """This is python multiline data containing
AAA"""
os.environ['bbb'] = """This is python multiline data containing
BBB"""
process = subprocess.Popen(['/bin/bash', '-c', 'diff <(echo "$aaa") <(echo "$bbb")'])
process.communicate()

【讨论】:

  • 我最终使用了 difflib,我认为这也可以。
猜你喜欢
  • 2011-04-12
  • 2012-06-23
  • 2013-10-08
  • 2022-01-14
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多