Python 3命令行参数

时间:2019-06-28 10:20:18

标签: python python-3.x

我正在尝试创建一个Python脚本,该脚本将从命令行接受一些参数。我正在尝试使用argparse,但无法使其正常工作。

我需要它的工作方式类似于AWS cli的工作方式,例如aws s3 cp有自己的参数,aws s3 ls有自己的参数

ref:https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html

https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html

这就是我所拥有的,但它总是需要mycmd选项

import argparse

parser = argparse.ArgumentParser()

parser.add_argument("mycmd", help="my test cmd")
parser.add_argument("-v", "--verbose", help="Verbose output", action="store_true")

args = parser.parse_args()

if args.mycmd:
    print(f"arg is mycmd")
if args.verbose:
    print("args v")

最终结果应该是mycmd1具有参数xyz,mycmd2具有参数abc等,并且都可以从单个python文件运行,例如python3 somename.py mycmd1 -x ...

4 个答案:

答案 0 :(得分:1)

您可以使用Python Click package,它对子命令有明确的支持:

import click    

@click.group()    
def cli():    
    pass    

@cli.command()    
@click.option('--arg1')    
def mycmd1(arg1):    
    click.echo('My command 1')      
    if arg1:    
        click.echo(arg1)    

@cli.command()    
@click.option('--arg2')
def mycmd2(arg2):    
    click.echo('My command 2')    
    if arg2:    
        click.echo(arg2)      

if __name__ == '__main__':    
    cli() 

用法:

(~)$ python -m click-example --help     
Usage: click-example.py [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  mycmd1
  mycmd2
(~)$ python -m click-example mycmd1 --help
Usage: click-example.py mycmd1 [OPTIONS]

Options:
  --arg1 TEXT
  --help       Show this message and exit.
(~)$ python -m click-example mycmd2 --help
Usage: click-example.py mycmd2 [OPTIONS]

Options:
  --arg2 TEXT
  --help       Show this message and exit.
(~)$ python -m click-example mycmd2 --arg1 err
Usage: click-example.py mycmd2 [OPTIONS]
Try "click-example.py mycmd2 --help" for help.

Error: no such option: --arg1
(~)$ python -m click-example mycmd1 --arg1 hello
My command 1
hello
(~)$

答案 1 :(得分:0)

我认为您的代码是完全有效的。 “ mycmd”只是您的论据名称。我对您的代码进行了一些更改以使其更清晰:

import argparse

parser = argparse.ArgumentParser()

parser.add_argument("mycmd", help="my test cmd")
parser.add_argument("-v", "--verbose", help="Verbose output", action="store_true")

args = parser.parse_args()

if args.mycmd == "mycmd1":
    print(f"arg is mycmd1")
elif args.mycmd == "mycmd2":
    print(f"arg is mycmd2")
else:
    print("arg not allowed")
if args.verbose:
    print("args v")

在我的机器上:

$ python3 test.py mycmd1 -v
arg is mycmd1
args v
$ python3 test.py 12 -v
arg not allowed
args v
$ python3 test.py mycmd2 -v
arg is mycmd2
args v

答案 2 :(得分:0)

根据argparse文档,如果您不声明位置参数是否可选,则将始终需要该参数。

您可以声明nargs使用您的选项多少次。在您的情况下,添加nargs='?'以使其为可选(如正则表达式中所述,?的意思是“ 0或1”)。

另请参阅nargs in argparse's documentation-有一些不错的可选输入/输出文件位置参数的例子


在您的情况下,您可能会找到有用的父arg解析器。 Link to the part of the documentation about parents-仅记得阅读有关处理冲突参数的部分(默认情况下,两个解析器都有-h选项,但您可能还需要对自己的参数进行一些调整)。

答案 3 :(得分:0)

c.py

import argparse
import sys



parser = argparse.ArgumentParser(
                prog='c', description="Description: to do some task",
                epilog='Run c.py --help for more information')

subparser = parser.add_subparsers(title="Commands", help="commands")
mycmd_args = subparser.add_parser('mycmd', help='to dome some task',description="To do some task")
mycmd_args.add_argument("--arg1", "-a1", dest="argument1",help="provide argument")
mycmd_args.add_argument("--arg2", "-a2", dest="argument2",help="provide argument")

mycmd1_args = subparser.add_parser('mycmd1', help='to dome some task',description="To do some task")
mycmd1_args.add_argument("--arg1", "-a1", dest="argument1",help="provide argument")
mycmd1_args.add_argument("--arg2", "-a2", dest="argument2",help="provide argument")


if __name__=="__main__":
    args=parser.parse_args(sys.argv[1:])
    if len(sys.argv) <= 1:
        sys.argv.append("-h")

    elif sys.argv[1] == "mycmd":
        print("mycmd arguemnts")
        print(args.argument1)
        print(args.argument2)   
    elif sys.argv[1] == "mycmd1":
        print("mycmd1 arguemnts")
        print(args.argument1)
        print(args.argument2)
    else:
        sys.argv.append("-h")

输出:

C:\Users\jt250054\Desktop>python c.py --help
usage: c [-h] {mycmd,mycmd1} ...

Description: to do some task

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

Commands:
  {mycmd,mycmd1}  commands
    mycmd         to dome some task
    mycmd1        to dome some task

Run c.py --help for more information

C:\Users\jt250054\Desktop>python c.py mycmd --help
usage: c mycmd [-h] [--arg1 ARGUMENT1] [--arg2 ARGUMENT2]

To do some task

optional arguments:
  -h, --help            show this help message and exit
  --arg1 ARGUMENT1, -a1 ARGUMENT1
                        provide argument
  --arg2 ARGUMENT2, -a2 ARGUMENT2
                        provide argument

C:\Users\jt250054\Desktop>python c.py mycmd --arg1 argument1
mycmd arguemnts
argument1
None

C:\Users\jt250054\Desktop>python c.py mycmd --arg1 argument1 --arg2 arugment2
mycmd arguemnts
argument1
arugment2

C:\Users\jt250054\Desktop>