ArgParse 模块想要在单个命令中使用两个参数

Posted

技术标签:

【中文标题】ArgParse 模块想要在单个命令中使用两个参数【英文标题】:ArgParser Module Want to use two arguments in a single command 【发布时间】:2017-08-13 04:34:51 【问题描述】:

我正在尝试将 python 中的 argparse 模块用于我正在编写的脚本,我希望能够在我的命令中使用多个标志并存储这些变量。这是我目前所拥有的。

parser = argparse.ArgumentParser(
                 description='This program allows for you to create a User in AD and add that User to a specific AD Group',
                 epilog='Note: In order to run this script you must have login credentials of an AD admin. \
                 You must also know the username, if you intend to search for users, or the group name if intending to search for group. \
                 The logging level is set to info by default.')

parser.add_argument('--listuser', nargs=?, default='None', type=str,help='Lists attributes for a given user. Example: "--listuser --username <AD username(s)> "')
    parser.add_argument('--listusergroups', nargs=?, default='None', type=str, help='Lists the groups a user is associated with attributes for a given user. Example: "--listusergroups < AD username(s)>"')
    parser.add_argument('--listgroupmembers', nargs=?, default='None', type=str,help='Lists the members of a given group. Example: "--listgroupmembers --groups <group(s)>"')
    parser.add_argument('--addgroupmembers', nargs=?, default='None', type=str, help='Adds members to a specific AD group. Example: "./AD_Utility --addgroupmembers <group(s)> --username <username(s)>"')
    parser.add_argument('--renamegroup', nargs=?, default='None', type=str, help='Renames the AD group"./AD_Utility --rename <group(s)> <new_group_name>"')
    parser.add_argument('--disableuser', nargs=?, default='None', type=str, help='Disables user from AD. Example: "./AD_Utility --disableusers --username <username(s)>"')
    parser.add_argument('--removeuserfromgroup', nargs=?, default='None', type=str, help='Disables user from AD. Example: "./AD_Utility --removeuserfromgroup <username> --group <groupname>"')
    parser.add_argument('--creategroups', nargs=?, default='None', type=str, help='Enter the name of the group you want to search for. Example: "aws')
    parser.add_argument('--username', nargs=?, default='None', type=str, help='Username of the account you intend to gain information on. Example: "amazing')
    parser.add_argument('--scope', nargs=?, default='None', type=str, help='Scope of the search for which you are executing. Example: "aws')
args = parser.parse_args()

function_mapping = 
 "listuser": attributes_of_a_user, # or optionally: "function": attributes_of_a_user, "nargs": "?", "default":..
 "listusergroups": find_users_groups,
 "listgroupmembers": get_users_associated_with_groups,
 "addgroupmembers": add_users_to_group,
# "renamegroup": 
 "disableuser": disable_user,
 "creategroups": create_group,
 "createuser": create_user_in_ad,
 # "username"
 # "scope"


for function_name, function in function_mapping.iteritems():
      if args[function_name]:
        function(*args[function_name])

service = args.serviceaccount
group = args.groups
listuser = args.listuser
listusergroups = args.listusergroups
addgroupmembers = args.addgroupmembers
disableuser = args.disableuser
group_name, new_group_name = args.renamegroup
scope = args.scope
username = args.username
new_users = get_users()

当我运行任何命令时,我如何得到无效的语法:

./<script_name>.py --create test123

谁能看到我在添加参数中的哪个地方出错了?

【问题讨论】:

【参考方案1】:

如果我理解正确,您想指定一个标志使用的命令行参数的数量? 看看this。具体来说:nargs - The number of command-line arguments that should be consumed. 例如,对于标志 --renamegroup,您需要 nargs=2 以便您可以将 --renamegroup oldname newname “Oldname”和“newname”作为 renamegroup 标志后面的两个参数。 基本上那条线应该是什么样子:

parser.add_argument('--renamegroup', nargs=2, default='None', type=str, help='Renames the AD group"./AD_Utility --rename <group(s)> <new_group_name>"')

【讨论】:

所以这确实回答了我提出的问题,但我认为我问得不是很好。除了它需要两个参数之外,我还想知道如何将这两个参数存储为变量。我在正确的轨道上吗?在这个特定示例中,我将如何将这些结果存储为变量:group_name = args.groups listuser = args.listuser listusergroups = args.listusergroups addgroupmembers = args.addgroupmembers disableuser = args.disableuser renamegroup = args.renamegroup 我相信你可以按照in the official docs的解释将action参数设置为“store”来做到这一点。 对于我的函数映射,例如,当我尝试将此脚本执行到 --listuser 时,我不断收到错误消息,提示 attributes_of_a_user 未定义。你知道是什么导致了这个问题吗?【参考方案2】:

尝试使用

parser.add_argument('--renamegroup', nargs=2, default='None', type=str, help='Renames the AD group"./AD_Utility --rename <group(s)> <new_group_name>"')

所以这个标志需要两个参数。

【讨论】:

所以这确实回答了我提出的问题,但我认为我问得不是很好。除了它需要两个参数之外,我还想知道如何将这两个参数存储为变量。我在正确的轨道上吗?在此特定示例中,我将如何将这些结果存储为变量:group_name = args.groups listuser = args.listuser listusergroups = args.listusergroups addgroupmembers = args.addgroupmembers disableuser = args.disableuser renamegroup = args.renamegroup 你可以使用group_name, new_group_name = args.renamegroup 这样会将响应存储为两个变量 group_name 和 new_group_name 太好了!那么我创建的函数图看起来如何呢?如果我将它们作为对象存储在函数映射中,我很好奇如何将 args 传递给我的函数? 我不太确定你想用函数映射实现什么。你能解释一下吗? 我编写了一大堆函数来管理 Active Directory 实例(无需担心特定函数本身以及其中的内容)。每个函数都接受一组参数,我希望这些参数值基于用户输入到他们使用脚本运行的命令中的内容。所以我对如何建议我构建函数映射感到困惑,每个函数如何知道为其参数输入什么值?那有意义吗?如果没有,我很抱歉,我会试着想想如何更好地问它。

以上是关于ArgParse 模块想要在单个命令中使用两个参数的主要内容,如果未能解决你的问题,请参考以下文章

如何让 argparse 使用选项而不是前缀从文件中读取参数

Python3中使用argparse模块解析命令行参数

Python3中使用argparse模块解析命令行参数

Argparse 命令行解析模块常用参数

python中argparse模块简单使用

python 命令行参数——argparse模块的使用