从 argparse 调用不带参数的方法
call method without args from 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 脚本内部的任何一种调用一起工作。
您的 change_modem_bank
函数尝试直接访问 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
,您必须弄清楚您的函数应该做什么,因为现在这会导致错误。
当您将其作为脚本调用时,会发生什么:
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")
您的函数假定在其全局参数 space 中有一个具有以下 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
变量,然后编写您的函数,这是一种可以使用该默认版本的方法。
我有一个使用 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 脚本内部的任何一种调用一起工作。
您的 change_modem_bank
函数尝试直接访问 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
,您必须弄清楚您的函数应该做什么,因为现在这会导致错误。
当您将其作为脚本调用时,会发生什么:
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")
您的函数假定在其全局参数 space 中有一个具有以下 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
变量,然后编写您的函数,这是一种可以使用该默认版本的方法。