簡體   English   中英

從stdin讀取並將其轉發到Python中的子進程

[英]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))

哪個有效,但效率不高。 誰能想到更好的解決方案? 也許是分割或復制流的方法?

附加限制:

  1. 子進程只能調用一次。 因此,我不能一次讀取一行,處理它,並將其轉發到子流程。
  2. 該解決方案必須在Python 2.6中運行

這對你有用嗎?

#!/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM