Stdin 인수를 통해 문자열을 subprocess.Popen에 파이프하는 방법
subprocess.Popen 함수를 사용하면 Python 스크립트가 새 프로세스를 생성하고 표준 입력, 출력 및 오류와 상호 작용합니다. 일반적인 사용 사례 중 하나는 stdin을 통해 하위 프로세스에 데이터를 전달하는 것입니다. 이는 객체 생성 중에 stdin=PIPE를 지정하여 달성할 수 있습니다.
그러나 cStringIO.StringIO 객체를 stdin 스트림으로 사용하려고 하면 다음과 같은 결과가 발생합니다. subprocess.Popen에서 예상하는 fileno 속성이 없기 때문에 오류가 발생합니다. 이 문제를 해결하려면 다음 기술을 활용하십시오.
Popen.communicate() 사용
공식 문서에 따르면 Popen.communicate()는 데이터가 전달될 것으로 예상합니다. 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())
subprocess.run(Python 3.5) 사용
Python 버전 3.5 이상의 경우 subprocess.run은 관리하기 위한 단순화된 방법을 제공합니다. 하위 프로세스. 단일 함수 호출로 문자열 입력을 전달하고 문자열 출력을 얻을 수 있습니다.
#!/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) print(p.stdout)
이러한 접근 방식을 채택하면 stdin 인수를 통해 문자열을 subprocess.Popen에 효과적으로 전달할 수 있으므로 프로그램에서 다음을 수행할 수 있습니다. 외부 프로세스와 원활하게 상호 작용합니다.
위 내용은 문자열을 subprocess.Popen의 stdin으로 파이프하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!