call method without args from argparse
我有一个使用argparse从命令行调用的方法。我还想从另一个方法调用该方法,在这种情况下,我会得到一个错误,说明args未定义。有没有办法解决这个问题,我已经尝试设置了一个默认值,但得到了相同的错误。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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() |
我想从另一个脚本调用类似的方法:
1 2 | import cellular_modem cellular_modem.change_modem_bank("2","0") |
目前我可以这样称呼它:
1 | myscript.py set_modem_bank -bank ${num} -modem ${modem_num} |
我希望它能与任何一种类型的调用一起工作,从cli和python脚本内部进行。
当您将其称为脚本时,会发生以下情况:
1 2 | args=parser.parse_args() change_modem_bank() # equivalent to args.func() |
当您导入模块时,该
1 2 3 4 | import cellular_modem import argparse args = argparse.Namepspace(simbank=xxx, modem_num=xxx) cellular_modem.change_modem_bank("2","0") |
您的函数假定在其全局参数空间中有一个具有以下两个属性的对象:
1 | args.sim_bank, args.modem_num |
您可以将函数更改为:
1 2 3 4 | 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 |
并在
1 | args.func(args=args) |
这样就可以清楚地看到函数从何处获取其
在导入时,您需要以某种方式初始化一个
您的
1 2 3 4 5 6 | def change_modem_bank(bank_num, modem): if"1" in bank_num: print"2" elif"2" in bank_num: print"2" print modem |
并用以下方式称呼它:
1 | args.func(args.sim_bank, args.modem_num) |
如果参数是