【发布时间】:2013-11-26 19:20:55
【问题描述】:
我正在尝试指定一个采用标准输入的可选参数。这将主要用于我程序中的管道数据,所以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='')。
看来我做的事情很简单,很普通,很多人问过。但它似乎对我不起作用。
关于如何让它工作的任何建议?
【问题讨论】:
-
你的意思是你试图创建一个参数,让你的程序从标准输入读取数据?
-
还有 - Python 2 或 3?
-
@RyPeck:Python 2.7。是的,一个将从标准输入中读取的参数。
-
你能用一个你期望行为的例子来更新你的问题吗?
-
这个问题可能更恰当地满足您的需求 - stackoverflow.com/questions/699390/…