Estou usando o eSpeak no Ubuntu e tenho um script Python 2.7 que imprime e fala uma mensagem:
import subprocess
text = 'Hello World.'
print text
subprocess.call(['espeak', text])
O eSpeak produz os sons desejados, mas confunde o shell com alguns erros (ALSA lib ..., sem conexão de soquete), portanto não consigo ler facilmente o que foi impresso anteriormente. O código de saída é 0.
Infelizmente, não há uma opção documentada para desativar a verbosidade, portanto, estou procurando uma maneira de silenciá-lo visualmente e manter o shell aberto limpo para interação adicional.
Como posso fazer isso?
python
python-2.7
subprocess
espeak
rypel
fonte
fonte
os.system
sintaxe. Embora seja apenas para ilustração. Ficar com subprocessosubprocess.DEVNUL
solução perfeita .Respostas:
Redirecione a saída para DEVNULL:
É efetivamente o mesmo que executar este comando do shell:
fonte
os.devnull
sesubprocess.DEVNULL
não estiver disponível (<3.3), usar emcheck_call()
vez decall()
não verificar o código retornado, abrir arquivos no modo bináriostdin/stdout/stderr
, o usoos.system()
deve ser desencorajado,&>
não funcionash
no Ubuntu e explícito>/dev/null 2>&1
pode ser usado.os.devnull
mas acidentalmente digitei. Além disso, estou mantendo o uso dos POs,call
já que eles não estão capturando a possível exceçãocheck_call
. E para oos.system
redirecionamento, era mais apenas uma ilustração do que o uso efetivo da abordagem de subprocesso está fazendo. Não é realmente uma segunda sugestão.close_fds=True
emsubprocess.call
para fechar oFNULL
descritor depois existe o subprocessoclose_fds=True
, os descritores de arquivos são fechados depois,fork()
mas antesexecvp()
, ou seja, eles são fechados no processo filho logo antes da execução do executável.close_fds=True
não funcionará no Windows se algum dos fluxos for redirecionado .close_fds
não fecha arquivos no processo pai .Aqui está uma versão mais portátil (apenas por diversão, não é necessário no seu caso):
fonte
DEVNULL
que não é totalmente geral, como o fornecido porsubprocess
; desde que abertowb
, não pode ser usadostdin
.'r+b'
modo se precisar.Use
subprocess.check_output
(novo no python 2.7). Suprimirá stdout e gerará uma exceção se o comando falhar. (Na verdade, ele retorna o conteúdo do stdout, para que você possa usá-lo posteriormente em seu programa, se desejar.) Exemplo:Você também pode suprimir o stderr com:
Para versões anteriores a 2.7, use
Aqui, você pode suprimir o stderr com
fonte
except subprocess.CalledProcessError as e
e então usee.code
ore.output
A partir do Python3, você não precisa mais abrir devnull e pode chamar subprocess.DEVNULL .
Seu código seria atualizado assim:
fonte
stderr
com ostdout
código acima (ou acrescentar como outro argumento) para suprimir as saídas. "Outputs" está no título da pergunta e o que me levou até aqui ... talvez trivial, mas achei que valeria a pena mencionar.Por que não usar commands.getoutput ()?
fonte
text
tiver aspas, ou usa uma codificação de caracteres diferente ou muito grande para uma linha de comando c) é apenas Unix (no Python 2)