使用sys.stdin.buffer.read()后使用input()时的EOFError

时间:2016-10-26 19:04:22

标签: linux python-3.x

我目前正在linux上编写一个python程序,它将通过sys.stdin.buffer.read()接受二进制流,然后我希望以后使用input()以交互方式接受输入。< / p>

这是一个完全做作的例子,说明了我的问题:

#!/usr/bin/env python3
import sys 

buf = b"Garbage Data"
#comment out the following line to avoid the EOFError:
buf = sys.stdin.buffer.read()

with open("outTempFile", 'wb') as f:
    f.write(buf)

print("Please enter your name:")
buf2 = input("First:\t")
print("Your first name is:\t{}".format(buf2))

当我使用stdin输入运行此程序时,我收到以下错误/输出:

-> % cat contrivedExample.py | ./contrivedExample.py Please enter your name: First: Traceback (most recent call last): File "./contrivedExample.py", line 11, in <module> buf2 = input("First:\t") EOFError: EOF when reading a line

输出文件outTempFile确实已写入,但input()的调用失败并显示EOFError。我猜这是因为STDIN与我在脚本命令行调用中使用的管道绑定。

当我注释第6行并使用相同的调用运行程序时:

-> % cat contrivedExample.py | ./contrivedExample.py

我得到以下输出:

Please enter your name: First: Your first name is: #!/usr/bin/env python3

这告诉我input()确实在命令行上提供的管道(STDIN)中读取|

我的问题是如何通过管道(|)将程序从读入切换到通过交互式终端提示阅读(通常通过input()完成)?

1 个答案:

答案 0 :(得分:0)

我找到的解决方案是通过linux管道(|)从STDIN读取后,只需用sys.stdin替换open('/dev/tty')input()允许echo "hello" | python -c 'import sys; buf = sys.stdin.read(); print(buf); sys.stdin=open("/dev/tty"); buf2=input(); print(buf2)' 从我的终端读取:

 $yourdir = "c:\temp\"
 Get-ChildItem $yourdir -File -Filter *.txt | gc | out-file -FilePath ([Environment]::GetFolderPath("Desktop") + "\totalresult.txt")