从argparse调用没有args的方法

时间:2015-05-15 15:32:12

标签: python argparse

我有一个使用argparse从命令行调用的方法。我也想从另一个方法调用该方法,在这种情况下,我得到一个错误,说没有定义args。有没有办法解决这个问题,我尝试过设置默认值但是我得到了同样的错误。

def change_modem_bank(bank_num=None, modem=None):  
    if args.sim_bank and args.modem_num:
        bank_num = args.sim_bank
        modem = args.modem_num  
    if "1" in bank_num:
        print "2" 
    elif "2" in bank_num:
         print "2"
    print modem

if __name__=='__main__':            
    parser_mode = subparsers.add_parser('set_modem_bank')
    parser_mode.add_argument('-bank',dest='sim_bank',help='SIM bank number',nargs='?',const=None,default=None)
    parser_mode.add_argument('-modem_num',dest='modem_num',help='Modem number',nargs='?',const=None,default=None)
    parser_mode.set_defaults(func=change_modem_bank)
    args=parser.parse_args()
    args.func()

我想从另一个脚本调用这样的方法:

import cellular_modem
cellular_modem.change_modem_bank("2","0")

目前我可以这样称呼它:

myscript.py set_modem_bank -bank ${num}  -modem ${modem_num} 

我希望它可以使用任何类型的调用,来自CLI和python脚本。

2 个答案:

答案 0 :(得分:1)

您的change_modem_bank函数尝试直接访问args,当您将其称为命令行脚本时,它会起作用,因为它在模块名称空间中,但是当您调用它时失败分别。只需修复它就可以传入args:

def change_modem_bank(bank_num, modem):  
    if "1" in bank_num:
        print "2" 
    elif "2" in bank_num:
         print "2"
    print modem

并将其命名为:

args.func(args.sim_bank, args.modem_num)

如果参数为None,您必须弄清楚您的函数应该做什么,因为这会导致错误。

答案 1 :(得分:1)

当你把它称为脚本时,会发生什么:

args=parser.parse_args()
change_modem_bank() # equivalent to args.func()

导入模块时,会跳过main部分,因此未设置args。如果要按原样调用change_modem_back,则需要创建一个看起来像解析器将生成的变量的args变量。这是实现这一目标的一种方式:

import cellular_modem
import argparse
args = argparse.Namepspace(simbank=xxx, modem_num=xxx)
cellular_modem.change_modem_bank("2","0")

您的函数假设在其全局参数空间中有一个具有以下2个属性的对象:

args.sim_bank, args.modem_num

您将功能更改为:

def change_modem_bank(bank_num=None, modem=None, args=None):  
    if args and args.sim_bank and args.modem_num:
        bank_num = args.sim_bank
        modem = args.modem_num  

并在main中调用它:

args.func(args=args)

这样很清楚函数从哪里得到args变量。当args是一个简单的默认值,例如None时,它也会合理地运作。

导入时需要初始化args变量的一种方式,然后编写函数是一种可以使用该默认版本的方法。