检测STDIN文件并阻止用户在Python中输入

时间:2019-01-31 01:10:49

标签: python stdin

我想编写一个命令行Python程序,该程序可以使用STDIN语法在Windows cmd.exe提示符下调用,并且如果没有提供输入文件,则将帮助文本打印到STDOUT。

STDIN语法与参数语法不同,它是嵌入式替换解决方案所必需的:

my_program.py < input.txt

这是我到目前为止所拥有的:

import sys

# Define stdout with \n newline character instead of the \r\n default
stdout = open(sys.__stdout__.fileno(), 
              mode=sys.__stdout__.mode, 
              buffering=1, 
              encoding=sys.__stdout__.encoding, 
              errors=sys.__stdout__.errors, 
              newline='\n', 
              closefd=False)

def main(args):
    lines = ''.join([line for line in sys.stdin.readlines()])
    lines = lines.replace( '\r\n', '\n' ).replace( '\t', '    ' )    
    stdout.write(lines)

if __name__=='__main__':
    main(sys.argv)

我无法弄清楚如何检测是否向STDIN提供了文件,如果没有提供文件,则无法提示用户输入。 sys.argv不包含STDIN。我可以将其包装在带有计时器的线程中,并等待一些文件访问上限时间,然后确定未提供文件可能,但是我想看看是否有更好的方法。我在SO中搜索了此问题,但无法找到避免计时器的答案。

2 个答案:

答案 0 :(得分:2)

test.py:

import sys

if sys.__stdin__.isatty():
    print("stdin from console")
else:
    print("stdin not from console")

执行:

> test.py
stdin from console
> test.py <input.txt
stdin not from console

答案 1 :(得分:0)

您正在使用的运算符将读取一个文件,并在stdin上为您的进程提供该文件的内容。这意味着您的脚本无法分辨是否正在馈送文件内容,或者键盘上没有真正快速的打字员输入与文件内容完全相同的一系列击键。

当您的脚本访问数据时,它只是一个字符流,只有您用于编写重定向的命令行界面才知道它是文件。