通过终端在命令下运行时,它会给出正确的输出,即排除顶部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
答案 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)