我想看看这是否可行。我想执行两个单独的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图形中。预先感谢您的帮助。
答案 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)