关于python:没有来自argparse的args的调用方法

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()

当您导入模块时,该main部分被跳过,因此没有设置args。如果您想按原样调用change_modem_back,那么您需要创建一个args变量,该变量看起来像解析器将生成的变量。有一种方法可以做到:

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

并在main中调用它作为:

1
args.func(args=args)

这样就可以清楚地看到函数从何处获取其args变量。当args是一个简单的默认值(如None时,它的行为也很合理。

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


您的change_modem_bank函数试图直接访问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)

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