tail命令未为subprocess.Popen提供正确答案

时间:2018-11-01 21:31:52

标签: python subprocess pipe popen

通过终端在命令下运行时,它会给出正确的输出,即排除顶部6行,显示剩余的data.out行。

tail -n +6 data.out

但是当通过subprocess.Popen处理相同命令时,如以下代码所示:

fin = open('data.out')
fout = file('data1.out','w')
line = 6
lineno = "-n +" + str(line)
p2 = subprocess.Popen(["tail",lineno], stdin=fin, stdout=fout)
errcode = p2.wait()
fin.close()
fout.close()

这将data.out的最后6行存储在data1.out文件中,这是不正确的。这将存储tail -n 6 data.out的输出,而不是给定和预期的tail -n +6 data.out

的输出

1 个答案:

答案 0 :(得分:2)

不要将多参数与列表参数混合

lineno = "-n +" + str(line)  # wrong: 2 arguments seen as one
p2 = subprocess.Popen(["tail",lineno], stdin=fin, stdout=fout)

您在这里有2个参数,+line可能会忽略tail部分。相反,只需为每个列表项传递一个参数:

p2 = subprocess.Popen(["tail","-n","+"+str(line)], stdin=fin, stdout=fout)

使用format可能更清晰:

p2 = subprocess.Popen(["tail","-n","+{}".format(line)], stdin=fin, stdout=fout)