2016-07-27 98 views
0

我有一个程序存储一些重要的变量作为程序正常运行所必需的字符串:DeviceNumber,IPAddressPort。这些变量存储在程序加载的文件中。使用argparse覆盖变量取决于标志,使用默认值,如果没有参数给出(python)

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

我可以使用像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线路输入的一些实例中的程序/输出将是:

所有值均为默认

$ 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 

你的想法...

为旗/ ARGS关系的语法,我也不知道是否有一个特定的语法python需要你使用(即-p 500-p500 v -p=500

+0

参数的语法不是特定于Python,但通常遵循GNU C'getopt'操作。 – theorifice

+0

_“但似乎不允许依赖于标志来表示其目的的可选参数”_似乎并不是你需要的。 – Arnial

+0

“似乎不允许依赖于标志来表示其目的的可选参数” - 您的意思是像'-p 123'中的'123'吗? argparse处理。 – user2357112

回答

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) 

从上面的例子中,扩展到允许额外的默认功能是微不足道的。请注意,由于长参数--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) 
+0

''store_int'' - 这是我以前没见过的动作值。 – hpaulj

+0

你说得对。我一直在混合起来。我会更新答案以使用'type = int' – theorifice

+0

谢谢!这很好,但有一个错误(我编辑)。你写了'type =“int”',它给出了一个'“Str类型不可调用”错误。你可以使用'type = int'。 –