嘗試將 StringIO 與 subprocess.Popen 用於 stdin會導致AttributeError.
import subprocess from cStringIO import StringIO subprocess.Popen(['grep', 'f'], stdout=subprocess.PIPE, stdin=StringIO('one\ntwo\nthree\nfour\nfive\nsix\n')).communicate()[0]
Traceback 突顯 cStringIO.StringIO 與 subprocess.Popen 所需的 fileno() 方法不相容。
AttributeError: 'cStringIO.StringI' object has no attribute 'fileno'
subprocess.Popen 文件需要使用 stdin=PIPE 進行資料傳輸標準輸入。建議使用os.popen() 替換語法:
pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin
改編原始程式碼:
from subprocess import Popen, PIPE, STDOUT p = Popen(['grep', 'f'], stdout=PIPE, stdin=PIPE, stderr=STDOUT) grep_stdout = p.communicate(input=b'one\ntwo\nthree\nfour\nfive\nsix\n')[0] print(grep_stdout.decode()) # -> four # -> five # ->
#!/usr/bin/env python3 from subprocess import run, PIPE p = run(['grep', 'f'], stdout=PIPE, input='one\ntwo\nthree\nfour\nfive\nsix\n', encoding='ascii') print(p.returncode) # -> 0 print(p.stdout) # -> four # -> five # ->對於
以上是如何透過標準輸入正確地將字串傳遞給`subprocess.Popen`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!