从文件重定向输入,但也显示在标准输出中?

从文件重定向输入,但也显示在标准输出中?

可以使用 < 运算符重定向文件中的输入。因此,如果我有一个 Python 脚本,例如:

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

然后我可以将输入放入这样的文件中:

Bob

然后用这个运行它:

$ python program.py < input.txt

执行此操作时,输出如下所示:

What is your name? Hello  Bob

有什么方法可以让输入的文本也出现在屏幕上,这样看起来就和正常运行程序一样吗?对于上面的例子,它看起来像这样:

What is your name? Bob
Hello Bob

我想要这个的原因是因为我正在写一本包含代码示例的书,并且我想自动运行程序并使输出出现在书中。我不知道这是否可行,但它会使整个过程变得更加容易,因为我可以编写程序,设置输入文件,然后让其余的事情自动发生!

谢谢阅读!

答案1

你可以使用expect将给定输入文件提供给给定 python 脚本的脚本:

伊恩.期望:

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

伊恩.py:

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

输入.txt:

"Jeff"

要使用给定的输入文件执行任何给定的 python 脚本,请运行:

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

你会得到:

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

我不是 TCL 或 Expect 黑客,因此我欢迎对该脚本进行改进。

具有两个输入的示例文件和脚本:

输入.txt:

"Jeff"
14

伊恩.py:

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

样本运行:

$ 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!

相关内容