如何解决sys.stdin 中 readlines() 之后的 input()?
我的脚本在 readlines()
上调用 sys.stdin
,然后调用 input()
,但最后一次调用不起作用。
这是我的脚本:
import click
@click.command()
@click.argument('data',type=click.File())
def inp(data):
lines = data.readlines()
print('Read {} lines. Continue?'.format(len(lines)))
choice = input().lower()
print("You said '{}'.".format(choice))
if __name__ == '__main__':
inp()
如果用户在命令行中指定了实际的文件参数,则该脚本可以正常工作,但如果他们通过管道输入数据并使用 -
则不行:
head -n10 data.txt | python3 script.py -
Read 10 lines. Continue?
Aborted!
我需要支持 -
后跟 input()
的阅读——我怎样才能让它发挥作用?
解决方法
为了节省我们的时间,您可以自由跳到底部查看结论
开始
我和你一样在寻找问题的答案。
首先,我认为以下可以解决问题...
没有EOF的多个管道输入
How to use `input()` after reading a file from `stdin`?
但是,它在我的电脑上没有成功, 因此,我试图弄清楚如何准确清除 EOF 标记...
Terminate/Break/Abort Python Console/sys.stdin readline()
How do you terminate/break/abort a Python console/sys.stdin readline()?
冲洗
How to flush the input stream in python?
在 C 语言中,我们使用 fflush(stdin),..etc 来清除缓冲区
在 C++ 语言中,我们使用 std::cin.get(),..etc 来清除缓冲区
但是 Python 语言呢??
搜索了2个小时,发现Python目前没有提供这个功能,清除stdin中的buffer/EOF
以及像这样成功的在线可用答案 How to use `input()` after reading a file from `stdin`? 仅适用于 Linux 系统
阅读后
https://www.twblogs.net/a/5c0ac824bd9eee6fb21399d4
*我非常确定(我认为)在 stdin 被文件采用后,Windows 中的 Python 不能使用 input
但是,这是否意味着我们应该打击 sys.stdin 方法?
不,显然,否则我不会花时间在这里打字...
这是我解决问题的最终方法
重新创建您的自己的输入如下
def new_input(): ## version 1
import msvcrt
str_=''
c=msvcrt.getche()
while ord(c)!=3 and ord(c)!=4 and ord(c)!=26 and ord(c)!=13:
# print(ord(c))
str_ = str_+str(c)[2:-1]
c=msvcrt.getche()
return str_
def new_input(interact_string_): ## version 2
import msvcrt
print(interact_string_,end ="")
str_=''
c=msvcrt.getche()
while ord(c)!=3 and ord(c)!=4 and ord(c)!=26 and ord(c)!=13:
# print(ord(c))
str_ = str_+str(c)[2:-1]
c=msvcrt.getche()
return str_
def new_input(interact_string_): ## version 3
import msvcrt
import os
print(interact_string_,end ="")
str_=''
print('')
c=msvcrt.getche()
while ord(c)!=3 and ord(c)!=4 and ord(c)!=26 and ord(c)!=13:
os.system('cls')
print(interact_string_,end ="")
# print(ord(c))
if ord(c)==8:
str_ = str_[0:-1]
print(str_)
else:
str_ = str_+str(c)[2:-1]
print(str_)
c=msvcrt.getche()
# print(str_)
return str_
这里是数字的含义
- ord(c)==3 将是 Ctrl+C 的键
- ord(c)==4 将是 Ctrl+D 的键
- ord(c)==26 将是 Ctrl+Z 的键
- ord(c)==13 将是 Enter 的键
- ord(c)==22 将是 Ctrl+C 的键
- ord(c)==8 将成为退格键
使用if-structure来反应还是很方便的,返回最后的字符串
结论:
-
在使用 stdin 到 readlines()/readline()/read() 读取文件后,您永远无法在 Windows 系统中使用 stdin 输入/输出 >
-
虽然在同样的情况下,Linux 系统上的相同问题是可以解决的,答案就在那里......
-
在我看来,根据我的研究,Windows 的最佳答案将是我的 (我当然会这么说..) 。 ++==> 重新创建输入()
感谢您的阅读,欢迎建设性的建议和礼貌的评论。也欢迎任何有更好想法或解决方案的人。
喜欢这个旅程和我一起阅读寻找答案的冒险
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。