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

Detect STDIN file and prevent user input in Python

我想编写一个命令行 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 不包含标准输入。我可以用一个定时器把它包在一个线程里,等待一些文件访问上限时间,然后决定一个文件可能没有提供,但我想看看有没有更好的方法.我在 SO 中搜索了这个问题,但找不到避免计时器的答案。

您使用的运算符将读取文件并在标准输入上为您的进程提供该文件的内容。这意味着您的脚本无法判断它是否正在输入文件内容,或者键盘上是否有真正快速的打字员输入了与文件内容匹配的完全相同的一系列击键。

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

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