dar*_*sky 6 python arguments argparse
我正在尝试指定一个采用stdin的可选参数。这将主要用于我程序中的管道数据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()
Run Code Online (Sandbox Code Playgroud)
现在我想做的是允许用户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)
Run Code Online (Sandbox Code Playgroud)
这使其成为可选参数,但是如果未传递任何管道,则程序将挂起,等待标准输入作为标准输入。删除default=sys.stdin和管道到我的程序,我得到:
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
Run Code Online (Sandbox Code Playgroud)
运行时。当我打印时args,我得到:Namespace(app='app', config='', g=False, hosts='03.app', infile=None, version='')。
看来我正在做的事情非常简单,常见,很多人都问过这件事。但这似乎与我无关。
关于如何使它工作的任何建议?
这样做...无需指定参数。如果你将管道输入传递给程序,它就会运行,如果你不这样做,它仍然会运行。raw_input()也会起作用。
import sys
if not sys.stdin.isatty():
stdin = sys.stdin.readlines()
print stdin
sys.stdin = open('/dev/tty')
else:
print "No stdin"
test_raw = raw_input()
print test_raw
Run Code Online (Sandbox Code Playgroud)
演示 -
rypeck$ echo "stdin input" | python test_argparse.py -a test
['stdin input\n']
raw_input working!
raw_input working!
rypeck$ python test_argparse.py -a test
No stdin
raw_input working!
raw_input working!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4023 次 |
| 最近记录: |