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.

Editar
Patrick Harrington mas eu don' t sei porque ...

Foi útil?

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).

  1. Inicie o Editor do Registro.
  2. Localize e clique na seguinte chave no registo:

    HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ Policies \ Explorer

  3. No menu Editar, clique em Adicionar valor e, em seguida, adicione a seguinte valor do Registro:

    nome

    Valor: InheritConsoleHandles
    Tipo de dados: REG_DWORD
    Radix: Decimal
    Dados do valor: 1

  4. Feche 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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top