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

Using argparse to overwrite variables depending on flags, use the default values if no args given (python)

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

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

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

我一直在阅读 pyDocs argparse Tutorial 和文档,但它似乎对我需要的东西没有太大用处 - 它涵盖了强制性参数和可选标志,但似乎不允许可选参数依靠标志来表示他们的目的。 编辑: 原来是这样,但是这个例子不是很明显,所以我错过了。 同样,我也很难在这里找到适用的问题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 行 inputs/outputs 的例子是:

所有值均为默认值

$ 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。参数以不同的顺序指定。

$ 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)

有几种方法可以为 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)

从上面的例子来看,扩展以允许额外的默认功能是微不足道的。请注意,由于长参数 --port 的命名,dest="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)