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)


답변

대신 commands.getoutput ()을 사용하지 않는 이유는 무엇입니까?

import commands

text = "Mario Balotelli"
output = 'espeak "%s"' % text
print text
a = commands.getoutput(output)


답변