从 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 变量,然后编写您的函数,这是一种可以使用该默认版本的方法。