Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3命令行参数_Python_Python 3.x - Fatal编程技术网

Python3命令行参数

Python3命令行参数,python,python-3.x,Python,Python 3.x,我正在尝试创建一个python脚本,它将接受来自命令行的一些参数。我正在尝试使用argparse,但无法使其正常工作 我需要它与aws cli的工作方式类似,例如aws s3 cp有自己的参数、aws s3 ls、有自己的参数等等 参考: 这就是我所拥有的,但它总是需要mycmd选项 import argparse parser = argparse.ArgumentParser() parser.add_argument("mycmd", help="my test cmd") pars

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

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

参考:


这就是我所拥有的,但它总是需要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…

我认为您的代码是完全有效的。“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

根据argparse文档,如果您没有说明位置参数是否是可选的,则始终需要它

您可以说明希望您的选项被
nargs
使用多少次。在您的情况下,添加
nargs='?'
使其成为可选的(类似于在正则表达式中的解释,
表示“0或1”)

另请参见-有一些很好的可选输入/输出文件位置参数示例


在您的情况下,您可能会发现有用的父arg解析器。-请记住阅读有关处理冲突参数的部分(默认情况下,两个解析器都有
-h
选项,但您可能还需要对自己的参数进行一些调整)。

您可以使用,它明确支持子命令:

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
(~)$
c、 派克


“但它总是需要mycmd选项”——那你为什么要添加它?我不明白你在问什么。
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>