我正在尝试指定一个采用标准输入的可选参数。这将主要用于我程序中的管道数据,所以someprog that outputs | python my_prog
.
我遵循了 argparse 文档,并在 Stackoverflow 上阅读了很多关于此的问题/答案,但似乎没有一个对我有用。
这是我最初拥有的:
parser = argparse.ArgumentParser(description='Upgrade Instance.')
parser.add_argument('--app', '-a', dest='app', action='store', required=True)
parser.add_argument('--version', '-v', dest='version', action='store', default='', required=False)
parser.add_argument('--config', '-c', dest='config', action='store', default = '', required=False)
args = parser.parse_args()
现在我想要做的是允许用户version
使用管道传递,而不是传递它。
我添加parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin)
到顶部,但这使它成为一个位置参数。这怎么可能?我认为nargs=?
使它成为可选的。
我需要它是一个可选参数。所以我把它改成:
parser.add_argument('--infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin)
这使它成为一个可选参数,但如果没有传递管道,程序会挂起等待 stdin 作为默认值。在我的程序中删除default=sys.stdin
和管道的东西我得到:
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
运行时。当我打印args
时,我得到:Namespace(app='app', config='', g=False, hosts='03.app', infile=None, version='')
。
看来我正在做的事情很简单,很常见,很多人都问过。但它似乎不适合我。
关于如何让它工作的任何建议?