2015-05-15 3 views
0

У меня есть метод, который я вызываю из командной строки с помощью argparse. Я также хочу вызвать этот метод из другого метода, в этом случае я получаю сообщение об ошибке, поскольку аргументы args не определены. Есть ли способ обойти это, я попытался установить значение по умолчанию, но получаю ту же ошибку.метод вызова без аргументов из argparse

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.

+0

Почему это нисходящее/попытка закрытия? – Paul

+0

Возможный дубликат [Вызывающие функции с помощью argparse] (http://stackoverflow.com/questions/5050920/calling-functions-with-argparse) – skrrgwasme

+0

Вам нужно предоставить нам больше контекста. Где обычно вызывается 'args = parser.parse_args'. – hpaulj

ответ

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

Ваша функция предполагает, что в глобальном аргументу пространстве есть объект с этими 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 при импорте, а затем написать свою функцию таким образом, чтобы она была в порядке с этой версией по умолчанию.

+0

Спасибо большое ответ, к сожалению, не работает в моем случае, так как тогда всем функциям понадобится хотя бы один аргумент из args = args, и у большинства из них его нет. Будет работать! – Paul

+0

решил это с помощью функции обертки, приветствует помощь. – Paul

1

Вашей 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, так как что приведет к ошибке.

Смежные вопросы