Python tubulação no Windows: Por que isso não funciona?
Pergunta
Eu estou tentando algo como isto
Output.py
print "Hello"
Input.py
greeting = raw_input("Give me the greeting. ")
print "The greeting is:", greeting
Na linha de cmd
Output.py | Input.py
Mas ele retorna um EOFError . Alguém pode me dizer o que estou fazendo de errado?
Obrigado por sua ajuda.
Solução
Eu testei isso na minha máquina Windows e funciona se você especificar o exe Python:
C:\>C:\Python25\python.exe output.py | C:\Python25\python.exe input.py
Give me the greeting. The greeting is: hello
Mas eu recebo um EOFError também se executar os comandos diretamente como:
output.py | input.py
Eu não sei exatamente por que isso acontece, eu ainda estou olhando para um presente, mas pelo menos este deve lhe fornecer uma solução alternativa para agora. Pode ter algo a ver com a maneira como o arquivo de manipulador é invocado para arquivos .py.
Atualizar : bem, o que você sabe. Parece que este é realmente um bug no Windows onde stdin / redirecionamento de stdout podem não funcionar corretamente quando iniciado a partir de uma associação de arquivo. Então a solução é conforme observado por mim e Patrick, você precisa especificar "python" será executado input.py, caso contrário não vai stdout redirecionamento de output.py ao stdin para input.py corretamente.
Referência :
http: //mail.python .org / Pipermail / python-bugs-lista / 2004 a agosto / 024923.html
http://support.microsoft.com/default.aspx?kbid = 321788
UPDATE 2 :
Para alterar esse comportamento e tornar o Windows tubos funcionam como esperado para stdin / stdout redirecionamento, você pode adicionar este valor ao registo (testado na minha caixa de e verificado funciona este como desejado).
- Inicie o Editor do Registro.
Localize e clique na seguinte chave no registo:
HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ Policies \ Explorer
No menu Editar, clique em Adicionar valor e, em seguida, adicione a seguinte valor do Registro:
nomeValor: InheritConsoleHandles
Tipo de dados: REG_DWORD
Radix: Decimal
Dados do valor: 1Feche o Editor do Registro.
Outras dicas
mude para:
Output.py | python Input.py
A saída será:
Dê-me a saudação. A saudação é: Olá
Aqui está o porquê você começa a EOFError (a partir da documentação sobre raw_input):
A função, em seguida, lê uma linha de entrada, converte para uma string (Decapagem um final de linha), e retornos que. Quando EOF é lido, EOFError é levantada.
http://docs.python.org/library/functions .html? highlight = raw_input # raw_input
Você pode querer usar sys.stdin , ele fornece um objeto de arquivo a partir do qual você pode usar a leitura, readlines métodos.
import sys
for greeting_line in sys.stdin.readlines():
print "The greeting is:", greeting_line.strip()