Erro de pipe com o script bash chamado de python

1

Estou tentando executar um script de shell dentro de algum código python, mas continuo recebendo uma mensagem de erro.

Script Python (test.py):

   import os
    f = os.popen('/home/test/Downloads/record.sh')
    f.close()

Script de shell (record.sh):

#!/bin/sh
rec -r 16k -c 1 -p | sox -p output.wav silence 1 0.1 1% -1 0.5 1% &

Quando eu corro:

python test.py

Esta é a mensagem de erro que recebo: FAIL sox: '-' erro ao gravar arquivo de saída: cano quebrado

Executar o script de shell sozinho funciona bem (por exemplo, ./record.sh).

O que estou fazendo de errado? Obrigado.

EDIT ABAIXO: Eu mudei o script de shell, então parece com isso (não há mais nenhuma tubulação):

#!/bin/sh
rec -r 16k -b 16 -c 1 output.wav silence 1 0.5 0.1% 1 1.0 0.1%

Com a ajuda de Stefano, tenho o seguinte script Python:

#!/usr/bin/python
from subprocess import Popen, PIPE
output = Popen(["sh", "/home/test/Downloads/data/recorder.sh", ], stdout=PIPE).communicate()[0]

Ainda preciso do PIPE e comunico bits?

O que eu preciso mudar, para que o script python não espere que o recorder.sh termine antes de prosseguir?

    
por joshu 24.12.2010 / 00:38

1 resposta

2

Para executar um script de shell no python 2.6, use o módulo commands :

import commands
status, output = commands.getstatusoutput("./script.sh")

status agora é o status do seu programa, esperamos que 0 . A saída é a mesma que se o script fosse executado assim:

{ cmd ; } 2>&1

Em python3, o método getstatusoutput foi movido para o subprocesso,

import subprocess
status, output = subprocess.getstatusoutput("./script.sh")

Por favor, consulte:

Na documentação da biblioteca padrão.

Existem mais maneiras de gerar subprocessos, e você precisa avaliar qual deles é o método correto no seu caso. Consulte os documentos subprocesso para ler sobre eles.

Uma maneira ainda melhor de executar seu script é:

from subprocess import Popen, PIPE
output = Popen(["sh", "script.sh", ], stdout=PIPE).communicate()[0]

Ele funcionará no python 2.6, 2.7, 3.1 e 3.2.

Note que você não pode usar o script de shell neste método, se você quiser canalizar a saída, use este método:

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

Considerando que o módulo de comandos aceitará "dmesg | grep hda"

    
por Stefano Palazzo 24.12.2010 / 00:52