首頁 >後端開發 >Python教學 >如何透過標準輸入正確地將字串傳遞給`subprocess.Popen`?

如何透過標準輸入正確地將字串傳遞給`subprocess.Popen`?

DDD
DDD原創
2024-12-05 09:54:12559瀏覽

How to Correctly Pass Strings to `subprocess.Popen` via stdin?

透過 stdin 將字串傳遞給 subprocess.Popen

問題

嘗試將 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
# ->

Python 3.5 解

Python 3.5 解
#!/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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn