【问题标题】:call method without args from argparse [closed]从argparse调用没有args的方法[关闭]
【发布时间】:2015-05-15 15:32:11
【问题描述】:

我有一个使用 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 脚本的调用。

【问题讨论】:

  • 为什么这被否决/试图关闭?
  • Calling functions with argparse 的可能重复项
  • 你需要给我们更多的背景信息。您通常在哪里拨打args=parser.parse_args
  • @hpaulj 它是从 main 调用的。因此,当从 CLI 调用它时它工作正常,我会将其编辑到我的代码中
  • main 的情况下,明确您的方法如何访问args

标签: python argparse


【解决方案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")

您的函数假定,在其全局参数空间中有一个具有以下两个属性的对象:

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

【讨论】:

  • 感谢很好的回答,不幸的是在我的情况下不起作用,因为所有函数都需要至少一个来自 args=args 的参数,而其中大多数都没有。会解决的!
  • 用包装函数解决了这个问题,为帮助喝彩。
【解决方案2】:

您的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,你必须弄清楚你的函数应该做什么,因为现在这会导致错误。

【讨论】:

    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2018-05-06
    • 2012-12-21
    相关资源
    最近更新 更多