以下代码是将Pipe的输出重定向到文件“CONTENT”并且它有一些内容,我想用“sort CONTENT1 | uniq”的输出覆盖它.... 但我无法覆盖它,也不知道代码后的天气是重定向到内容(即是否正确)。请帮帮我....
f1=open('CONTENT','w')
sys.stdout=f1
p1 = subprocess.Popen(["sort", "CONTENT1"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["uniq"], stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()
p2.communicate()
sys.stdout=sys.__stdout__
答案 0 :(得分:1)
以下是如何捕获第一个进程的输出并将其传递给第二个进程,然后将其输出写入文件:
import subprocess
with open('CONTENT','w') as f1:
p1 = subprocess.Popen(["sort", "CONTENT1"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["uniq"], stdin=subprocess.PIPE, stdout=f1)
p1_out = p1.communicate()[0] # catch output
p2.communicate(p1_out) # pass input
你根本不应该修改sys.stdout
。请注意,您需要一个
为每个进程调用方法communicate
。另请注意
communicate()
将传递p1
的所有输出
p2
。
以下是如何将p1
逐行传递给p2
的方法:
import subprocess
with open('CONTENT','w') as f1:
p1 = subprocess.Popen(["sort", "CONTENT1"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["uniq"], stdin=subprocess.PIPE, stdout=f1)
out_line = p1.stdout.readline()
while out_line:
p2.stdin.write(out_line)
out_line = p1.stdout.readline()
管道最干净的方法如下:
import subprocess
with open('CONTENT','w') as f1:
p1 = subprocess.Popen(["sort", "CONTENT1"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["uniq"], stdin=p1.stdout, stdout=f1)
p1.stdout.close()
或者,当然,你可以使用的设施 shell,它只是为这些任务而制作的:
import subprocess
with open('CONTENT','w') as f1:
p = subprocess.Popen("sort CONTENT1 | uniq", shell=True,
stdout=f1)