O que estou tentando fazer é executar o python em uma janela de terminal e redirecionar o stdin de um pipe nomeado. Em seguida, escrevo no pipe nomeado em outro terminal e tenho esse comando executado em python.
Terminal 1:
mkfifo p1
python < p1
Terminal 2:
echo -n "print \"Hello World\"" > p1
O que acontece é - o python imprime Hello World
e sai. O que eu quero fazer é manter o python em execução para executar o próximo comando. Como faço isso no shell?
exec 3> p1
fazendo e o que é&3
&exec 3> &1
? Obrigado.exec 3>&-
funcionaria da mesma forma queexec 3>&1
aqui?3>&-
aqui.3>&1
funcionaria tão bem, mas faria pouco sentido. ObrigadoVocê pode usar
tail -f
para manter o fifo aberto depois de graváecho
-lo.Por que isso funciona
python
está lendop1
. Quando chega ao final do arquivo, para de ler. Esse é um comportamento normal para leituras de arquivos, mesmo se o arquivo for um pipe nomeado.tail
com o-f
sinalizador (a seguir) continuará lendo um arquivo após seu término.fonte
echo "print \"Hello World\" " > p1
no segundo terminal e nada aconteceu - mas o terminal também não foi bloqueado. O terminal com python permaneceu bloqueado até eu^c
sair, sair e finalizar o python com uma mensagem de interrupção do teclado sendo exibida pelo python.tail -f
truque ao descompactar o arquivo tar dividido em blocos por meio de um pipe nomeado. Funcionou maravilhosamente.Você precisa enviar o programa inteiro de uma só vez.
Quando você chama executar,
python < p1
o shell está aguardando a entrada antes de chamar o python. Ou seja, python nem sequer começar a executar em tudo até que todo o fluxo de dados foi lido pelo shell e, em seguida, é passado em sua totalidade parapython
.Até mesmo a execução
python -u p1
(ou seja, sem buffer e lida do arquivop1
)python
tentará ler o arquivo inteiro antes que ele seja executado.Tente este experimento.
Terminal 1:
Terminal 2:
Você verá que pode enviar várias linhas, mas o python no termo 1 não faz nada. Agora pressione ctrl+ D. O programa inteiro é executado de uma só vez.
Portanto, para resumir, se você deseja que o python leia de um canal, você precisa enviar o programa inteiro. Você não pode usar o python interativamente dessa maneira.
fonte
Talvez a abordagem da cauda seja melhor (mais flexível), mas como alternativa:
fonte
-n
pode ter sido removido. E depois disso, 0. O terminal com oecho
comando é bloqueado 1. python não executa o comando até eu pressionar^c
oecho
terminal e os dois processos terminarem.