2016-07-11 59 views
0

我似乎无法弄清楚如何在脚本中调用add_user()函数并将所有参数传递给它。如果我这样做没有从parse_args()中的subparser返回名称空间

if args.adduser: 
    add_user(username, account, groups) 

它没有找到adduserNamespace

AttributeError: 'Namespace' object has no attribute 'adduser' 

不过,如果我添加此

parser_adduser.set_defaults(func=add_user) 

它似乎执行add_user()功能,但没有通过任何的参数。

def parse_args(): 
    helptext = 'Script to Add, Delete, Update AWS Users' 
    parser = argparse.ArgumentParser(description=helptext, 
          prog='aws-IAM-user.py', 
          usage='%(prog)s [position] [-u] [optional]', 
          conflict_handler='resolve',) 

    parser.add_argument('-v', '--version', 
         dest='version') 

    subparsers = parser.add_subparsers(title='Main commands', 
          help='MORE INFO: [COMMAND] -help') 

    parent_parser = argparse.ArgumentParser(add_help=False) 
    parent_parser.add_argument('-u', '--username', 
          dest='username', 
          action='store', 
          help='list a single user or multiple users, ' 
           'seperated by space', 
          nargs='+', 
          required=True) 
    parent_parser.add_argument('-a', '--account', 
          dest='account', 
          action='store', 
          nargs='+', 
          help='Specify Account(s).' 
          ' Default is to use all available') 

    # 'Add User Parsers' 

    parser_adduser = subparsers.add_parser('adduser', 
          parents=[parent_parser], 
          help='adduser -u USER -a ACCOUNT -g GROUP.' 
          ' Passwords are auto-gen') 
    parser_adduser.add_argument('-g', '--group', 
           dest='groups', 
           nargs='+', 
           help='specify group(s) seperated by space') 
    parser_adduser.set_defaults(func=add_user) 

    return parser.parse_args() 


if __name__ == '__main__': 
    args = parse_args() 

    config = ConfigParser.RawConfigParser() 
    config.read(AWS_CONFIG_FILE) 

    username = args.username 
    account = args.account 

我不知道,如果我只是愚蠢,但我似乎无法弄清楚如何使用adduser调用脚本,并通过同时使用subparser的功能,我想用这样所有标志厉害。

回答

0

我认为您误解了添加子分析器的含义。添加子分析器时,如果在命令行中选择了子分析器,则该子分析器的参数将被添加到名称空间中。然后,与命令行交互的标准方式是为每个接受args命名空间作为参数的子分析器创建一个入口点。例如假设您想要有adduserremoveuser子分析器。他们你可能会这样做:

def add_user(args): 
    """Entry point for add_user.""" 
    account = args.account 
    username = args.username 
    ... 

def remove_user(args): 
    """Entry point for remove_user.""" 
    remove_user_argument = args.remove_user_argument 
    ... 

subparsers = parser.add_subparsers() 

add_user_parser = subparsers.add_parser('adduser') 
add_user_parser.add_argument(...) 
add_user_parser.set_defaults(func=add_user) 

add_user_parser = subparsers.add_parser('removeuser') 
add_user_parser.add_argument(...) 
add_user_parser.set_defaults(func=remove_user) 

args = parser.parse_args() 
args.func(args) 
+0

那就是它。谢谢。谢谢。 **谢谢** –

+0

@JenniferBasalone - 没问题。我很乐意帮助:-)。 – mgilson

相关问题