[英]Python - a subprocess writing to stdin so that the main program can read it from the stdin
我有一個從stdin接收輸入的python程序。 現在,我必須編寫另一個程序並將其作為子進程調用,以便每次啟動該子進程時,它都應從另一個文本文件讀取數據並將其寫入stdin,然后我的主程序從stdin讀取並使用它。
from subprocess import Popen, PIPE, STDOUT
import os
import sys
def read():
p = Popen(['python', 'in.py'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
out = p.communicate()
print out[0]
def main():
read()
if __name__ == "__main__":
main()
import sys,os
import subprocess
def main():
f = open("ad.txt","r")
for line in f:
print line
if __name__ == "__main__":
main()
基本上,我的問題是in.py
讀取整個文件並打印到我不想要的STDOUT中,而是應該一次傳遞一個字符。 如果ad.txt
是這樣的:
asdfgh
我應該先得到"a"
然后是"s"
然后是"d"
然后是"f"
..依此類推..每次我調用該函數時,都應逐個字符地讀取文件中的下一個字符。 就是這樣! ew! 請幫助我,我有很多工作要做! 先謝謝了
第一個程序應從文件(或stdin
)讀取並寫入stdout
(而不是stdin
)。 同樣,第二個程序應從stdin
讀取並寫入stdout
。 現在,您可以使用管道符號在命令行中將它們粘合在一起:
python first.py | python second.py
而已! 這些程序都不需要知道其他程序。 那就是使用“流水線”的美妙之處。
附錄:Shell流水線在緩沖區上工作。 Shell偵聽第一個程序,並用其輸出填充緩沖區。 同時,第二個程序只要有要讀取的內容就從緩沖區讀取,否則它會空閑。 通信是同時進行的,僅需要固定大小的內存。
示例代碼:
# first.py
import sys
for line in open("input.txt"):
processed_line = process_line(line)
sys.stdout.write(processed_line)
# second.py
import sys
for line in sys.stdin:
processed_line = process_line(line)
sys.stdout.write(processed_line)
這些示例遍歷行(如果使用文本文件,則更好)。 您可以輕松地逐字節執行相同的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.