2016-10-12 157 views
5

我可以使用​​读取不需要按特定顺序命名的命令行参数吗?我浏览了documentation,但其中大部分都是基于所提供的参数显示内容(如--h)。读命名命令参数

现在,我的脚本读取命令,未命名的参数:

myscript.py富-VAL酒吧-VAL

使用sys.argv

foo = sys.argv[1] 
bar = sys.argv[2] 

但我想通过命名参数来改变输入以使其与命令无关:

myscript.py --bar =酒吧-VAL --foo = foo的-VAL

+0

不能找到一个很好的重复,但在这里获得一些例子:http://stackoverflow.com/questions/11415570/directory- path-types-with-argparse –

回答

3

可以使用Optional Arguments像这样:

import argparse, sys 

parser=argparse.ArgumentParser() 

parser.add_argument('--bar', help='Do the bar option') 
parser.add_argument('--foo', help='Foo the program') 

args=parser.parse_args() 

print args 
print sys 

然后,如果你有./prog --bar=bar-val --foo foo-val叫它它打印:

Namespace(bar='bar-val', foo='foo-val') 
['Untitled 14.py', '--bar=bar-val', '--foo', 'foo-val'] 

或者,如果用户想帮助argparse构建太:

$ ./prog -h 
usage: Untitled 14.py [-h] [--bar BAR] [--foo FOO] 

optional arguments: 
    -h, --help show this help message and exit 
    --bar BAR Do the bar option 
    --foo FOO Foo the program 
+0

我不知道有可能使用'--opt = val'语法。这真是太棒了:) – Tryph

+0

在args被加载后,我如何读取'foo'的值? – amphibient

+0

有没有像'args.get('foo')'? – amphibient

2

答案是肯定的。快速浏览the argparse documentation也可以回答。

这是一个非常简单的例子,argparse能够处理更多的特定需求。

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('--foo', '-f', help="a random options", type= str) 
parser.add_argument('--bar', '-b', help="a more random option", type= int, default= 0) 

print(parser.format_help()) 
# usage: test_args_4.py [-h] [--foo FOO] [--bar BAR] 
# 
# optional arguments: 
# -h, --help   show this help message and exit 
# --foo FOO, -f FOO a random options 
# --bar BAR, -b BAR a more random option 

args = parser.parse_args("--foo pouet".split()) 
print(args) # Namespace(bar=0, foo='pouet') 
print(args.foo) # pouet 
print(args.bar) # 0 

关当然,在一个真正的剧本,你会不会硬代码的命令行选项,将parser.parse_args()(无参数),而不是打电话。它会使得以列表sys.args作为命令行参数。

您将可以这样调用这个脚本:

test_args_4.py -h # prints the help message 
test_args_4.py -f pouet # foo="pouet", bar=0 (default value) 
test_args_4.py -b 42 # foo=None, bar=42 
test_args_4.py -b 77 -f knock # foo="knock", bar=77 

您将通过阅读文档发现很多其他特点的;)

+0

但是在你的脚本中,你不知道'pouet'作为参数值 – amphibient

+2

传递了很好的答案。如果没有RTM评论会更好...... – dawg

+0

@amphibient我不明白你的意思...... – Tryph