我目前正在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()
完成)?
答案 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")