我有一个程序,它将一些重要变量存储为字符串,这些变量是程序正常运行所必需的:DeviceNumber
、IPAddress
和Port
。这些变量存储在由程序加载的文件中。
出于调试目的,我希望能够使用命令行参数快速覆盖文件。参数都是可选的,如果不使用,则只使用从文件中取出的变量。
我可以使用DeviceNumber = sys.args[1]
之类的东西进行简单的位置args,并且只有在存在args的情况下才覆盖vars,但如果您按错误的顺序输入变量,或者如果您输入了IPAddress
和Port
,但没有输入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
默认DNumber
和IPAddress
,覆盖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)