2017-02-06 69 views
0

得到一个错误添加命令行参数与现有

"error: unrecognized arguments: "

建在参数试图建立自己的命令行参数的时候。我正在将我的论点定义为:

import argparse 

def fn_a(parsed_args): 
    print("hello i am in function fn_a") 

def fn_b(parsed_args): 
    print("hello i am in function fn_b") 

parser=argparse.ArgumentParser(description="my first arg scripting") 
parser.add_argument('--a', dest='action', action='store_const',const=fn_a) 
parser.add_argument('--b', dest='action', action='store_const', const=fn_b) 

parsed_args = parser.parse_args() 
if parsed_args.action is None: 
    parser.parse_args(['-h']) 
    parsed_args.action(parsed_args) 

可能是什么问题?

+0

最后一行的东西不应该被缩进,如果假定每次运行时。你在尝试什么命令行。 – hpaulj

+0

该代码无效。该行'高清fn_a'和'高清fn_b'不应该缩进。 –

回答

0

你可以改变你的代码使用try-except块,只解析已知参数,例如:

try: 
    parsed_args, unknown_args = parser.parse_known_args() 
except: 
    parsed_args = None 

if parsed_args and parsed_args.action: 
    parsed_args.action(parsed_args) 
else: 
    try: 
     parser.parse_known_args(['-h']) 
    except: 
     pass 
+0

'parser.parse_known_args([ ' - H'])''执行sys.exit'。 – hpaulj

0

更改最后一位:

if parsed_args.action is None: 
    parser.parse_args(['-h']) 
parsed_args.action(parsed_args) 

让我做的事:

1218:~/mypy$ python stack42067791.py 
usage: stack42067791.py [-h] [--a] [--b] 

my first arg scripting 

optional arguments: 
    -h, --help show this help message and exit 
    --a 
    --b 
1218:~/mypy$ python stack42067791.py --a 
hello i am in function fn_a 
1218:~/mypy$ python stack42067791.py --b 
hello i am in function fn_b 
1218:~/mypy$ python stack42067791.py -h 
usage: stack42067791.py [-h] [--a] [--b] 

my first arg scripting 

optional arguments: 
    -h, --help show this help message and exit 
    --a 
    --b 

这就是它响应--a--b,并重复-h,如果没有提供。

别的生产标准argparse错误信息与使用

1218:~/mypy$ python stack42067791.py foo 
usage: stack42067791.py [-h] [--a] [--b] 
stack42067791.py: error: unrecognized arguments: foo 
1220:~/mypy$ python stack42067791.py --b foo 
usage: stack42067791.py [-h] [--a] [--b] 
stack42067791.py: error: unrecognized arguments: foo 

使用parse_known_args让你在这最后的情况下扔掉foo。但你为什么要这么做?

parsed_args,extras = parser.parse_known_args() 
print(parsed_args, extras) 

打印像

(Namespace(action=None), []) 
(Namespace(action=<function fn_b at 0xb71f1b54>), ['foo']) 
(Namespace(action=<function fn_a at 0xb744d25c>), [])