![](/img/trans.png)
[英]Python read stdin from piped process and from Popen subprocess simultaneously
[英]Read from stdin AND forward it to a subprocess in Python
我正在為一個程序編寫一個包裝腳本,該腳本可選擇接受來自STDIN的輸入。 我的腳本需要處理文件的每一行,但它還需要將STDIN轉發到它正在包裝的程序。 在極簡主義的形式,這看起來像這樣:
import subprocess
import sys
for line in sys.stdin:
# Do something with each line
pass
subprocess.call(['cat'])
請注意,我實際上並沒有嘗試包裝cat
,它只是作為一個示例來演示是否正確轉發STDIN。
通過上面的例子,如果我注釋掉for循環,它就可以正常工作。 但是,如果我使用for循環運行它,則沒有任何內容被轉發,因為我已經讀到了STDIN的末尾。 我不能seek(0)
到文件的開頭,因為你不能在流上尋找。
一種可能的解決方案是將整個文件讀入內存:
import subprocess
import sys
lines = sys.stdin.readlines()
for line in lines:
# Do something with each line
pass
p = subprocess.Popen(['cat'], stdin=subprocess.PIPE)
p.communicate(''.join(lines))
哪個有效,但效率不高。 誰能想到更好的解決方案? 也許是分割或復制流的方法?
附加限制:
這對你有用嗎?
#!/usr/bin/env python2
import subprocess
import sys
p = subprocess.Popen(['cat'], stdin = subprocess.PIPE)
line = sys.stdin.readline()
####################
# Insert work here #
####################
line = line.upper()
####################
p.communicate(line)
例:
$ echo "hello world" | ./wrapper.py
HELLO WORLD
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.