我有一个程序将一些重要变量存储为程序正常运行所必需的字符串:DeviceNumber
,IPAddress
和Port
。这些变量存储在一个文件中,该文件由程序加载。
出于调试目的,我希望能够使用命令行参数快速覆盖文件。 args都是可选的,如果不使用,那么它只使用从文件中取出的变量。
我可以使用类似DeviceNumber = sys.args[1]
之类的东西来执行简单的位置参数,并且只有在args存在时才覆盖变量,但是如果以错误的顺序输入变量,则存在无法处理的问题,或者如果您输入IPAddress
和Port
但不输入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
默认DNumber
和IPAddress
,覆盖Port
$ python myfile.py -p 500
DNumber:2000 IP:159.142.32.30 Port:500
你明白了......
对于flag / args关系的语法,我也不确定是否需要使用特定语法python(即-p 500
与-p500
v -p=500
)
答案 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)