使用现有参数添加命令行参数

时间:2017-02-06 12:26:49

标签: python argparse

收到错误

  

"错误:无法识别的参数:"

对于尝试构建自己的命令行参数时的内置参数。我将我的论点定义为:

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)

可能是什么问题?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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>), [])