首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不带args的args调用方法

不带args的args调用方法
EN

Stack Overflow用户
提问于 2015-05-15 15:32:11
回答 2查看 503关注 0票数 0

我有一个从命令行调用的方法,使用a解析。我还想从另一种方法调用该方法,在这种情况下,我会得到一个错误,说明没有定义args。有办法解决这个问题吗,我尝试过设置一个默认设置,但是我得到了相同的错误。

代码语言:javascript
复制
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()

我想像这样从另一个脚本调用该方法:

代码语言:javascript
复制
import cellular_modem
cellular_modem.change_modem_bank("2","0")

现在我可以这样称呼它:

代码语言:javascript
复制
myscript.py set_modem_bank -bank ${num}  -modem ${modem_num} 

我希望它能处理两种类型的调用,从CLI到python脚本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-15 16:52:25

当您将其称为脚本时,所发生的情况是:

代码语言:javascript
复制
args=parser.parse_args()
change_modem_bank() # equivalent to args.func()

当您导入模块时,main部件将被跳过,因此不会设置args。如果您想按原样调用change_modem_back,那么您需要创建一个类似于解析器生成的args变量。有一种方法是这样的:

代码语言:javascript
复制
import cellular_modem
import argparse
args = argparse.Namepspace(simbank=xxx, modem_num=xxx)
cellular_modem.change_modem_bank("2","0")

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

代码语言:javascript
复制
args.sim_bank, args.modem_num

您可以将函数更改为如下所示:

代码语言:javascript
复制
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中将其调用为:

代码语言:javascript
复制
args.func(args=args)

这样,函数从哪里获取其args变量就很清楚了。当args是一个简单的默认值(如None )时,它的行为也是合理的。

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

票数 1
EN

Stack Overflow用户

发布于 2015-05-15 16:39:12

您的change_modem_bank函数尝试直接访问args,如果您将它作为命令行脚本调用,因为它位于模块命名空间中,但是单独调用它时会失败。只需修复它就可以让args传入:

代码语言:javascript
复制
def change_modem_bank(bank_num, modem):  
    if "1" in bank_num:
        print "2" 
    elif "2" in bank_num:
         print "2"
    print modem

用以下方式称呼它:

代码语言:javascript
复制
args.func(args.sim_bank, args.modem_num)

如果参数为None,则必须弄清楚函数应该做什么,因为这将导致错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30263399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档