>백엔드 개발 >파이썬 튜토리얼 >stdin을 통해 `subprocess.Popen`에 문자열을 올바르게 전달하는 방법은 무엇입니까?

stdin을 통해 `subprocess.Popen`에 문자열을 올바르게 전달하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-05 09:54:12560검색

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

stdin을 통해 subprocess.Popen에 문자열 전달

문제

stdin에 대해 subprocess.Popen과 함께 StringIO를 활용하려고 하면 다음과 같은 오류가 발생합니다. 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
# -> 

위 내용은 stdin을 통해 `subprocess.Popen`에 문자열을 올바르게 전달하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.