Redireciona a entrada do arquivo, mas mostra também no stdout?

2

Pode-se redirecionar a entrada de um arquivo com o < operador. Então, se eu tenho um script Python, como:

name = input("Enter your name: ")
print("Hello", name)

Então eu posso colocar a entrada em um arquivo como este:

Bob

E, em seguida, execute-o com isto:

$ python program.py < input.txt

Ao fazer isso, a saída é assim:

What is your name? Hello  Bob

Existe alguma maneira de fazer com que o texto de entrada apareça na tela também, de modo que pareça como se você tivesse executado o programa normalmente? Para o exemplo acima, ficaria assim:

What is your name? Bob
Hello Bob

A razão que eu quero isso é porque eu estou trabalhando em um livro que tem exemplos de código, e eu quero automatizar a execução dos programas e ter a saída aparecem no livro. Eu não sei se isso é possível, mas isso tornaria todo o processo muito mais fácil, já que eu posso apenas escrever os programas e configurar os arquivos de entrada, e então ter o resto acontecendo automaticamente!

Obrigado pela leitura!

    
por Ian Finlayson 19.01.2017 / 17:52

1 resposta

0

Você pode usar um script expect para alimentar um determinado arquivo de entrada em um determinado script python:

ian.expect:

set script [lindex $argv 0]
set input  [lindex $argv 1]
set inputfh [open $input r]
spawn -noecho python $script
while {[gets $inputfh line] != -1} {
  expect {
    -re "(.+)" {
        send "$line\n"
    }
  }
}
close $inputfh
interact

ian.py:

name = input("Enter your name: ")
print("Hello", name)

input.txt:

"Jeff"

Para executar qualquer script python com um determinado arquivo de entrada, execute:

expect -f ian.expect ian.py input.txt

e você terá:

$ expect -f ian.expect ian.py input.txt
Enter your name: "Jeff"
('Hello', 'Jeff')

Eu não sou um hacker TCL ou Expect, então gostaria de receber melhorias no script.

Exemplo de arquivo e script com duas entradas:

input.txt:

"Jeff"
14

ian.py:

name = input("Enter your name: ")
print("Hello", name)
age = input("Your age? ")
print("So, you are already " + str(age) + " years old, " + name + "!")

corrida de amostra:

$ expect -f ian.expect ian.py input.txt
Enter your name: "Jeff"
('Hello', 'Jeff')
Your age? 14
So, you are already 14 years old, Jeff!
    
por 19.01.2017 / 20:24