[英]Redirecting Output of PIPE to a FILE in python
以下代碼是將Pipe的輸出重定向到文件“ CONTENT”,並且其中包含一些內容,我想用“ sort CONTENT1 | uniq”的輸出覆蓋它。...但是我無法覆蓋它,並且我不知道天氣以下代碼是否重定向到CONTENT(即正確與否)。 請幫幫我。
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__
這是捕獲第一個進程的輸出並將其傳遞給第二個進程的方法,該進程隨后將其輸出寫入文件:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.