【发布时间】:2019-01-31 01:10:49
【问题描述】:
我想编写一个可以在 Windows cmd.exe 提示符下使用 STDIN 语法调用的命令行 Python 程序,如果没有提供输入文件,我想将帮助文本打印到 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 中搜索了这个问题,但找不到避免计时器的答案。
【问题讨论】:
-
将输入数据发送到标准输入和输入/输出重定向是 POSIX 系统上的常见做法。一般来说,使用该程序的人负责正确使用它并将数据提供给标准输入或在没有发送任何内容时关闭管道。