我有一个使用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脚本。
答案 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
变量的一种方式,然后编写函数是一种可以使用该默认版本的方法。