在单个子过程调用中使用单个输出文件运行多个bash命令

时间:2018-08-07 17:21:34

标签: python bash subprocess

我想看看这是否可行。我想执行两个单独的bash命令,其中第二个命令需要将第一个命令的输出作为输入。这两个命令都需要生成一个输出文件。这可以在单个子过程调用中完成吗?我想将其与psrecord结合使用,并在同一图中绘制两个命令,这就是为什么我试图将它们结合在一起的原因:

psrecord 'program --arg1 foo --arg2 bar --output out1.txt && program out1.txt --arg3 baz --output out2.csv' --log activity.txt --plot plot.png

很抱歉以前是否曾问过这个问题;我知道有很多关于执行多个bash命令的文章,但是我更关心2个输出文件,将第一个输出传递给第二个命令,并且能够将两个命令记录在一个psrecord图形中。预先感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

听起来您的目标是编写一个bash单线然后在python中推送,所以我将重点放在bash上。

我假设您的stdout for cmd1需要同时转到下一个命令和文件,而您的cmd2仅需要将stdout传递到文件。 tee十分适合。

cmd1 | tee /path/to/cmd1file.log | cmd2 > /path/to/cmd2file.log

通常,|接受一个命令的输出,并输入该行中下一个命令的输入。 tee接受输入,将一份副本推送到stdout并将一份副本放置在其他位置;在这种情况下,保存到日志文件。 >stdout写入文件。

答案 1 :(得分:2)

试图尽可能安全的代码版本可能看起来像:

import shlex, pipes
if hasattr(shlex, 'quote'):
    quote = shlex.quote # Python 3
else:
    quote = pipes.quote # Python 2

inner_cmds = [
  [
    'program',
    '--arg1', 'foo',
    '--arg2', 'bar',
    '--output', 'out1.txt'
  ], [
    'program',
    'out1.txt',
    '--arg3', 'baz',
    '--output', 'out2.csv'
  ]
]

inner_cmd_str = ' && '.join(' '.join(shlex.quote(word) for word in inner_cmd) for inner_cmd in inner_cmds)
cmd = [
  'psrecord', inner_cmd_str,
  '--log', 'activity.txt',
  '--plot', 'plot.png'
]

p = subprocess.Popen(cmd)