argparse python模块的文档虽然非常棒,但对于我这个初学者来说,现在还难以理解。我不需要在命令行上做数学运算,也不需要在屏幕上修改格式行或更改选项字符。我想做的就是“如果arg是A,做这个,如果B做那个,如果以上都没有显示帮助并退出”。


当前回答

作为现有答案的补充,如果你足够懒惰,可以使用称为protoargs的代码生成工具。它从配置生成参数解析器。对于python,它使用argparse。

配置可选A和B:

syntax = "proto2";
message protoargs
{
    optional string A     = 1; // A param description
    optional string B     = 2; // B param description
}//protoargs

配置所需的A和B:

syntax = "proto2";
message protoargs
{
    required string A     = 1; // A param description
    required string B     = 2; // B param description
}//protoargs

位置A和B的构型:

syntax = "proto2";
message protoargs
{
    required string A     = 1; // A param description
    required string B     = 2; // B param description
}//protoargs
message protoargs_links
{
}//protoargs_links

现在你要做的就是:

python ./protoargs.py -i test.proto -o . --py

并使用它(这里可以举其他例子):

import sys
import test_pa

class ArgsParser:
    program = "test"
    description = "Simple A and B parser test."

    def parse(self, argv):
        self.config = test_pa.parse(self.program, self.description, argv)

    def usage(self):
        return test_pa.usage(self.program, self.description)

if __name__ == "__main__":
    parser = ArgsParser()

    if len(sys.argv) == 1:
        print(parser.usage())
    else:
        parser.parse(sys.argv[1:])

        if parser.config.A:
            print(parser.config.A)

        if parser.config.B:
            print(parser.config.B)

如果你想要更多的改变配置,重新生成解析器,使用更新的parser.config。

UPD:正如规则中提到的,我必须指定这是我自己的项目

其他回答

代码文件:argparseDemo.py

简单:普通情况

name(abbr, full), with help import argparse argParser = argparse.ArgumentParser() argParser.add_argument("-n", "--name", help="your name") args = argParser.parse_args() print("args=%s" % args) print("args.name=%s" % args.name) call python argparseDemo.py -n Crifan python argparseDemo.py --name Crifan output: args=Namespace(name='Crifan') and args.name=Crifan type argParser.add_argument("-a", "--age", type=int, help="your current age") print("type(args.age)=%s" % type(args.age)) call: python argparseDemo.py --age 30 output: type(args.age)=<class 'int'> and args.age=30 required argParser.add_argument("-a", "--age", required=True, type=int, help="your current age") call: python argparseDemo.py output: error argparseDemo.py: error: the following arguments are required: -a/--age default argParser.add_argument("-a", "--age", type=int, default=20, help="your current age. Default is 20") call: python argparseDemo.py output: args.age=20 choices argParser.add_argument("-f", "--love-fruit", choices=['apple', 'orange', 'banana'], help="your love fruits") call: python argparseDemo.py -f apple output: args=Namespace(love_fruit='apple') and args.love_fruit=apple multi args argParser.add_argument("-f", "--love-fruit", nargs=2, help="your love fruits") call: python argparseDemo.py -f apple orange output: args.love_fruit=['apple', 'orange']

细节

最简单的:-x

code: import argparse argParser = argparse.ArgumentParser() argParser.add_argument("-a") # most simple -> got args.a, type is `str` args = argParser.parse_args() print("args.a=%s" % args.a) usage = run in command line python argparseDemo.py -a 30 or: ./argparseDemo.py -a 30 makesure argparseDemo.py is executable if not, add it: chmod +x argparseDemo.py output args.a=30 Note default type is str argParser.add_argument("-a") == argParser.add_argument("-a", type=str) print("type(args.a)=%s" % type(args.a)) -> type(args.a)=<class 'str'> args type is Namespace print("type(args)=%s" % type(args)) -> type(args)=<class 'argparse.Namespace'> args value is Namespace(a='30') print("args=%s" % args) -> args=Namespace(a='30') so we can call/use args.a

参数名称

全参数名称:——xxx

代码 argparse。add_argument(“——”,“时代”) 使用 python argparseDemo.py -a 30 或者:python argparseDemo.py——30岁 获取解析值:args.age 注意:不是参数。a,并且不存在参数

包含多个单词的完整参数名称:——xxx-yyy

代码 argparse。add_argument(“——”“——现在的年龄”) 获取解析值:args.current_age

添加帮助说明:help

代码 argparse。Add_argument ("-a", help="your age") # with help 输出 使用——帮助可以看到描述 python argparseDemo.py——help 使用:argparseDemo.py [-h] [-a A] 可选参数: -h,——help显示帮助信息并退出 A A你的年龄

指定参数类型:type

代码 argParser。add_论证(“a”,类型=int) 输出 打印型”(args。a)“%型(args = % s。a型)- > (args。a) = < int’级> 打印(“args=%s”)-> args=Namespace(a=30)

添加默认值:default

代码 argparse。Add_argument ("-a", type=int, default=20) #如果没有传递a,则使用默认值:20 效果 用法:python argparseDemo.py 输出:打印(arg游戏。age=%s" % args.age) -> args=命名空间(a=20)

作为现有答案的补充,如果你足够懒惰,可以使用称为protoargs的代码生成工具。它从配置生成参数解析器。对于python,它使用argparse。

配置可选A和B:

syntax = "proto2";
message protoargs
{
    optional string A     = 1; // A param description
    optional string B     = 2; // B param description
}//protoargs

配置所需的A和B:

syntax = "proto2";
message protoargs
{
    required string A     = 1; // A param description
    required string B     = 2; // B param description
}//protoargs

位置A和B的构型:

syntax = "proto2";
message protoargs
{
    required string A     = 1; // A param description
    required string B     = 2; // B param description
}//protoargs
message protoargs_links
{
}//protoargs_links

现在你要做的就是:

python ./protoargs.py -i test.proto -o . --py

并使用它(这里可以举其他例子):

import sys
import test_pa

class ArgsParser:
    program = "test"
    description = "Simple A and B parser test."

    def parse(self, argv):
        self.config = test_pa.parse(self.program, self.description, argv)

    def usage(self):
        return test_pa.usage(self.program, self.description)

if __name__ == "__main__":
    parser = ArgsParser()

    if len(sys.argv) == 1:
        print(parser.usage())
    else:
        parser.parse(sys.argv[1:])

        if parser.config.A:
            print(parser.config.A)

        if parser.config.B:
            print(parser.config.B)

如果你想要更多的改变配置,重新生成解析器,使用更新的parser.config。

UPD:正如规则中提到的,我必须指定这是我自己的项目

补充一下其他人已经说过的话:

我通常喜欢使用'dest'参数指定变量名,然后使用'globals().update()'将这些变量放在全局命名空间中。

用法:

$ python script.py -i "Hello, World!"

代码:

...
parser.add_argument('-i', '--input', ..., dest='inputted_variable',...)
globals().update(vars(parser.parse_args()))
...
print(inputted_variable) # Prints "Hello, World!"

argparse文档相当不错,但遗漏了一些可能不明显的有用细节。(@Diego Navarro已经提到了一些,但我会试着稍微扩展一下他的答案。)基本用法如下:

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--my-foo', default='foobar')
parser.add_argument('-b', '--bar-value', default=3.14)
args = parser.parse_args()

从parse_args()返回的对象是一个“Namespace”对象:其成员变量以命令行参数命名的对象。Namespace对象是你访问参数和与它们相关的值的方式:

args = parser.parse_args()
print (args.my_foo)
print (args.bar_value)

(请注意,argparse在命名变量时用下划线替换参数名中的'-'。)

在许多情况下,您可能希望将参数简单地用作不带值的标志。你可以像这样在argparse中添加它们:

parser.add_argument('--foo', action='store_true')
parser.add_argument('--no-foo', action='store_false')

上面的代码将分别创建值为True的变量'foo'和值为False的变量'no_foo':

if (args.foo):
    print ("foo is true")

if (args.no_foo is False):
    print ("nofoo is false")

还要注意,你可以在添加参数时使用"required"选项:

parser.add_argument('-o', '--output', required=True)

这样,如果你在命令行中忽略了这个参数,argparse会告诉你它缺失了,并停止脚本的执行。

最后,请注意,可以使用vars函数创建参数的dict结构,如果这使您的生活更容易的话。

args = parser.parse_args()
argsdict = vars(args)
print (argsdict['my_foo'])
print (argsdict['bar_value'])

如你所见,vars返回一个dict,参数名作为键,值作为值。

还有许多其他选项和可以做的事情,但这应该涵盖最基本的常见使用场景。

最简单的答案!

附注:编写argparse文档的人是愚蠢的

python代码:

import argparse
parser = argparse.ArgumentParser(description='')
parser.add_argument('--o_dct_fname',type=str)
parser.add_argument('--tp',type=str)
parser.add_argument('--new_res_set',type=int)
args = parser.parse_args()
o_dct_fname = args.o_dct_fname
tp = args.tp
new_res_set = args.new_res_set

运行代码

python produce_result.py --o_dct_fname o_dct --tp father_child --new_res_set 1