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



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

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

我可以使用DeviceNumber = sys.args[1]之类的东西进行简单的位置args,并且只有在存在args的情况下才覆盖vars,但如果您按错误的顺序输入变量,或者如果您输入了IPAddressPort,但没有输入DeviceNumber,则无法处理此问题。

我一直在阅读pyDocs argparse教程和文档,但它似乎对我的需求没有太大用处——它涵盖了强制性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

具有不同命令行输入/输出的一些示例如下:

所有值均为默认值

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

相关内容

  • 没有找到相关文章

最新更新