在python中将PIPE的输出重定向到FILE

时间:2013-09-26 06:06:31

标签: python pipe stdout

以下代码是将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__

1 个答案:

答案 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)

参考:http://docs.python.org/2/library/subprocess.html