Pipe to fifo from script

0

Eu quero enviar comandos de um script para cintilar (o software VOIP). Eu pensei que poderia fazer isso com um pipe nomeado, então eu criei um

mkfifo phonecmd

Se eu começar a twinkle e pipe tail do pipe nomeado para ele eu posso enviar o comando escrevendo para o pipe nomeado

tail -f phonecmd | twinkle -c
...
echo answer > phonecmd

Mas o que eu realmente quero é enviar comandos usando um script python que monitora os pinos GPIO em um pi de framboesa, mas não consigo descobrir como fazer isso.

python gpio.py

imprimirá "responder" ou "tchau", dependendo se um pino GPIO no pi de framboesa for alterado.

python gpio.py | phonecmd

Isso me dá um erro, pois phonecmd não é um comando (é um pipe nomeado).

python gpio.py > phonecmd

Isso só funciona. O redirecionamento é armazenado em buffer, portanto, tudo é gravado no canal phonecmd apenas quando o processo python é fechado.

Existe uma maneira de ter o redirecionamento ou o canal "ao vivo"?

    
por c0m4 22.10.2018 / 12:55

1 resposta

1

A razão pela qual o operador de pipe | não funciona é porque o operador de pipe espera outro comando. O operador de redirecionamento de saída > retorna para um arquivo e um canal nomeado é um arquivo no sentido geral, mas não um arquivo regular.

A saída para um pipe está normalmente em buffer, você pode liberar o fluxo de saída ou pode alterar o buffer do stdout.

No seu caso, a solução mais elegante seria abrir o pipe nomeado em Python, escrever a string ("answer" ou "bye") e depois fechar o arquivo / pipe. Dessa forma, você desvinculou o processo do servidor e o cliente Python. Você pode até reiniciar o processo do servidor ( twinkle -c ) e manter o processo do Python em execução.

    
por 22.10.2018 / 13:51

Tags