首页 > 解决方案 > 检测 STDIN 文件并阻止用户在 Python 中输入

问题描述

我想编写一个命令行 Python 程序,该程序可以在 Windows cmd.exe 提示符下使用 STDIN 语法调用,并在未提供输入文件的情况下将帮助文本打印到 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 中搜索了这个问题,但找不到避免计时器的答案。

标签: pythonstdin

解决方案


测试.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

推荐阅读