使用argparse根据标志覆盖变量,如果没有给出args,则使用默认值(python)

时间:2016-07-27 23:32:48

标签: python argparse

我有一个程序将一些重要变量存储为程序正常运行所必需的字符串:DeviceNumberIPAddressPort。这些变量存储在一个文件中,该文件由程序加载。

出于调试目的,我希望能够使用命令行参数快速覆盖文件。 args都是可选的,如果不使用,那么它只使用从文件中取出的变量。

我可以使用类似DeviceNumber = sys.args[1]之类的东西来执行简单的位置参数,并且只有在args存在时才覆盖变量,但是如果以错误的顺序输入变量,则存在无法处理的问题,或者如果您输入IPAddressPort但不输入DeviceNumber

我一直在阅读pyDocs argparse Tutorial和文档,但它对于我需要的内容似乎并不十分有用 - 它涵盖了强制args和可选标志,但似乎不允许依赖于它的可选args表示其目的的旗帜。 编辑: 原来确实如此,但示例不是很明显,所以我错过了。同样,我在SE上找不到适用的问题也很困难。

简而言之,给出了像

这样的程序
#Default Names loaded from file
DeviceNumber = "2000"
IPAddress = "159.142.32.30"
Port = 80

#if command line args entered:
    #overwrite default vars with arg corresponding to each one
    #this probably involves argparse, but I don't know how

print "DNumber:"+DeviceNumber+" IP:"+IPAddress+" Port:"+Port

具有不同cmd行输入/输出的一些示例将是:

所有值均为默认值

$ python myfile.py
DNumber:2000 IP:159.142.32.30 Port:80 

所有值都被覆盖

$ python myfile.py -n 1701 -ip 120.50.60.1 -p 3000
DNumber:1701 IP:120.50.60.1 Port:3000 

默认DNumber,覆盖IPAddress + Port。 Args以不同的顺序指定。

$ python myfile.py -p 123 -ip 124.45.67.89
DNumber:2000 IP:124.45.67.89 Port:123 

默认DNumberIPAddress,覆盖Port

$ python myfile.py -p 500
DNumber:2000 IP:159.142.32.30 Port:500

你明白了......

对于flag / args关系的语法,我也不确定是否需要使用特定语法python(即-p 500-p500 v -p=500

1 个答案:

答案 0 :(得分:2)

有几种方法可以为argparse指定的参数定义默认值。向解析器添加参数时,可以指定默认值。简单地:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-p", "--port", dest="port", default=500,
    type=int, help="specify port")

args = parser.parse_args()
print "You've selected port: %d" % (args.port)

从上面的示例中,扩展以允许其他默认功能是微不足道的。请注意,由于long参数dest="port"的命名,默认情况下已--port。像这样:

parser.add_argument("-p", "--port", dest="port", default=None,
    type=int, help="specify port")

args = parser.parse_args()

if args.port is None:
    port = read_port_from_file()
    print "No optional port specified. Reading value from file." 

print "You've selected port: %d" % (args.port)