繁体   English   中英

来自sys.stdin的readlines()之后的input()?

[英]input() after readlines() from sys.stdin?

我有一个案例,我的脚本在sys.stdin上调用readlines() ,然后调用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()

如果用户在命令行上指定了实际的文件参数,则脚本可以正常工作,但如果他们 pipe 输入数据并使用-则不会:

head -n10 data.txt | python3 script.py -  
Read 10 lines. Continue?
Aborted!

我需要支持-阅读后跟input() - 我怎样才能让它工作?

为了节省我们的时间,你可以自由跳到底部看结论

开始

我正在像你一样寻找问题的答案。

首先,我认为以下将解决问题......

没有 EOF 的多个管道输入

从`stdin`读取文件后如何使用`input()`?

但是,它在我的计算机上没有成功,因此,我试图弄清楚如何准确清除 EOF 标记......

终止/中断/中止 Python 控制台/sys.stdin readline()

如何终止/中断/中止 Python 控制台/sys.stdin readline()?

冲洗

如何刷新 python 中的输入 stream?

在 C 语言中,我们使用 fflush(stdin), ..etc 来清除缓冲区

在 C++ 语言中,我们使用 std::cin.get(), ..etc 来清除缓冲区

但是 Python 语言怎么样?

搜索2小时后,我意识到Python到目前为止不提供这个function,清除标准输入中的缓冲区/EOF

并且在线提供的答案像这样成功如何从`stdin`读取文件后使用`input()`? 仅适用于 Linux 系统

看完这篇

https://www.twblogs.net/a/5c0ac824bd9eee6fb21399d4

*我很确定(我认为)Windows 中的 Python 在文件采用标准输入后无法使用输入

但是,这是否意味着我们应该使用 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 将是Backspace的键

并且使用if-structure进行反应仍然很方便,并返回最终字符串


结论:

  1. 在使用 stdin 到 readlines()/readline()/read() 读取文件后,您永远无法Windows 系统中使用 stdin 输入/输出

  2. 同时,在同样的情况下, Linux 系统上的相同问题是可以解决的,答案将在那里......

  3. 在我看来并根据我的研究, Windows的最佳答案将是的(当然我会这么说..) ++==>重新创建您的输入()

感谢您的阅读,欢迎有建设性的建议和礼貌的评论。 也欢迎任何有更好想法或解决方案的人。

如果你喜欢和我一起享受旅程,同时阅读我的冒险寻找答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM