Python 2.7에서 하위 프로세스의 출력을 숨기는 방법
우분투에서 eSpeak를 사용하고 있으며 메시지를 인쇄하고 말하는 Python 2.7 스크립트가 있습니다.
import subprocess
text = 'Hello World.'
print text
subprocess.call(['espeak', text])
eSpeak는 원하는 사운드를 생성하지만 일부 오류 (ALSA lib ..., 소켓 연결 없음)로 쉘을 어지럽히므로 이전에 인쇄 된 내용을 쉽게 읽을 수 없습니다. 종료 코드는 0입니다.
불행히도 자세한 기능을 해제 할 수있는 문서화 된 옵션이 없으므로 시각적으로 만 침묵시키고 추가 상호 작용을 위해 열린 껍질을 깨끗하게 유지하는 방법을 찾고 있습니다.
어떻게해야합니까?
출력을 DEVNULL로 리디렉션하십시오.
import os
import subprocess
FNULL = open(os.devnull, 'w')
retcode = subprocess.call(['echo', 'foo'], stdout=FNULL, stderr=subprocess.STDOUT)
이 쉘 명령을 실행하는 것과 사실상 동일합니다.
retcode = os.system("echo 'foo' &> /dev/null")
다음은 더 휴대하기 쉬운 버전입니다 (재미만으로는 필요하지 않습니다).
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from subprocess import Popen, PIPE, STDOUT
try:
from subprocess import DEVNULL # py3k
except ImportError:
import os
DEVNULL = open(os.devnull, 'wb')
text = u"René Descartes"
p = Popen(['espeak', '-b', '1'], stdin=PIPE, stdout=DEVNULL, stderr=STDOUT)
p.communicate(text.encode('utf-8'))
assert p.returncode == 0 # use appropriate for your program error handling here
사용하십시오 subprocess.check_output
(파이썬 2.7의 새로운 기능). 명령이 실패하면 stdout을 억제하고 예외를 발생시킵니다. (실제로 stdout의 내용을 반환하므로 원하는 경우 나중에 프로그램에서 사용할 수 있습니다.) 예 :
import subprocess
try:
subprocess.check_output(['espeak', text])
except subprocess.CalledProcessError:
# Do something
다음을 사용하여 stderr을 억제 할 수도 있습니다.
subprocess.check_output(["espeak", text], stderr=subprocess.STDOUT)
2.7 이전의 경우
import os
import subprocess
with open(os.devnull, 'w') as FNULL:
try:
subprocess._check_call(['espeak', text], stdout=FNULL)
except subprocess.CalledProcessError:
# Do something
여기에서 stderr를 억제 할 수 있습니다.
subprocess._check_call(['espeak', text], stdout=FNULL, stderr=FNULL)
Python3부터 더 이상 devnull을 열 필요가 없으며 subprocess.DEVNULL 을 호출 할 수 있습니다 .
코드는 다음과 같이 업데이트됩니다.
import subprocess
text = 'Hello World.'
print(text)
subprocess.call(['espeak', text], stderr=subprocess.DEVNULL)
python 2.7x와 함께 Windows에서 하위 프로세스 모듈을 사용하는 경우 (이 질문에 국한되지 않지만 제목과 일치)에만 억제하려는 오류 (이 질문에만 해당) 인 경우 다음과 같이 할 수 있습니다.
output = subprocess.check_output(["arp", "-a", "-N", "127.0.0.2"], stderr=subprocess.STDOUT)
시스템에서 위의 코드를 사용하여 테스트 할 수 있어야하지만 arp 테이블에 127.0.0.2가있는 경우 nic이없는 ip를 선택할 수 있습니다.
왜 commands.getoutput ()을 사용하지 않습니까?
import commands
text = "Mario Balotelli"
output = 'espeak "%s"' % text
print text
a = commands.getoutput(output)
참고 URL : https://stackoverflow.com/questions/11269575/how-to-hide-output-of-subprocess-in-python-2-7
'IT' 카테고리의 다른 글
CSS3 애니메이션 종료시 최종 상태 유지 (0) | 2020.04.01 |
---|---|
커서 위치에서 시작하여 VIM에서 줄을 빠르게 삭제하려면 어떻게해야합니까? (0) | 2020.04.01 |
git (버전 제어)에서 데이터베이스를 어떻게 배치 할 수 있습니까? (0) | 2020.03.31 |
“int main () {(([] () {}) ());}”은 어떻게 C ++에 유효합니까? (0) | 2020.03.31 |
차고에 차가 있습니까? (0) | 2020.03.31 |