【问题标题】:Redirecting Output of PIPE to a FILE in python将PIPE的输出重定向到python中的文件
【发布时间】:2013-10-01 23:14:09
【问题描述】:

以下代码是将管道的输出重定向到文件“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__

【问题讨论】:

  • 为什么不直接将p2 标准输出直接 发送到f1stdout=f1.
  • 可以给我看那行....?
  • @MartijnPieters 不是真的,这个问题是关于用管道连接两个进程,然后将最终输出传递给文件。

标签: python pipe stdout


【解决方案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

【讨论】:

  • 感谢您的回答,但它并没有覆盖 CONTENT 文件,而是在附加.....?
  • open('CONTENT','w') 应该打开文件CONTENT 进行写入,覆盖其中的所有内容。要追加,您需要open('CONTENT','a')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 2016-10-07
  • 2010-10-27
  • 1970-01-01
相关资源
最近更新 更多