我有一个从命令行调用的方法,使用a解析。我还想从另一种方法调用该方法,在这种情况下,我会得到一个错误,说明没有定义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脚本。
发布于 2015-05-15 16:52:25
当您将其称为脚本时,所发生的情况是:
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")您的函数假设,在其全局参数空间中有一个具有以下两个属性的对象:
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变量,然后编写函数,这是一种可以接受默认版本的方法。
发布于 2015-05-15 16:39:12
您的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,则必须弄清楚函数应该做什么,因为这将导致错误。
https://stackoverflow.com/questions/30263399
复制相似问题