【问题标题】:Argparse pass command line string to variable python3argparse 将命令行字符串传递给变量 python3
【发布时间】:2017-08-20 20:50:31
【问题描述】:

我已经阅读了argparsedocs,我正在尝试制作一个程序,它接受命令行参数并将这些值传递给如下变量:

ssh.py -username admin -password password -hostlist 192.168.1.1, 192.168.1.2 -commands uname -a, whoami 

当我在我的程序中静态分配这些值时,它可以工作,但是无论目标是列表还是单个字符串,我都无法让 argpase 将字符串传递给变量。

这行得通:

hostlist = ['192.168.1.1','192.168.1.2']
username = 'admin'
password = 'password'
commands = ['uname -a','whoami']

这会静默运行,不工作或产生错误或写入日志文件:

    parser = argparse.ArgumentParser()
    parser.add_argument('-u', '-username', help='The Username for authentication.')
    parser.add_argument('-p', '-password', help='The password for authentication.')
    parser.add_argument('-l', '-hostlist', nargs='+', help='List of devices to interact with.')
    parser.add_argument('-c', '-commands', nargs='+', help='An exact list of commands to run')

    args = parser.parse_args()
    u,username = args.username
    p,password = args.password
    l,hostlist = args.hostlist
    c,commands = args.commands

【问题讨论】:

  • 我预计 u,username = args.username 会引发 unpacking 错误。 args.username 应该是 None 或单个字符串。但是您提供了 2 个要填充的变量,uusername。感觉就像您在使用基本 Python 时遇到问题,而不仅仅是 argparse

标签: python python-3.x list argparse


【解决方案1】:

这段代码有几个问题,以及你是如何使用它的。

  1. 长选项应该用两个连字符指定:

    parser.add_argument('-u', '--username', help='The Username for authentication.')
    
  2. 每个选项仅在args 中填充一个值,因此您不应尝试解压缩两个。试试这个:

    username = args.username
    
  3. 值在命令行中用空格分隔,而不是逗号,所以使用这个:

    --hostlist 192.168.1.1 192.168.1.2
    
  4. 命令行中包含空格的值将在空格上拆分并解释为单独的值(“单词”)。要强制将它们解释为单独的单词,请将它们括在引号中:

    --commands 'uname -a' 'whoami'
    

    或者,您可以使用反斜杠转义空格:

    --commands uname\ -a whoami
    

【讨论】:

    【解决方案2】:

    谢谢大家!现在它似乎工作正常:

        parser = argparse.ArgumentParser()
        parser.add_argument('-u', '--username', action='store', dest='username', help='The ssh username.')
        parser.add_argument('-p', '--password', action='store', dest='password', help='The ssh password.')
        parser.add_argument('-l', '--hostlist', nargs='+',action='store', dest='hostlist', help='List of devices to interact with.')
        parser.add_argument('-c', '--commands', nargs='+',action='store', dest='commands', help='An exact list of commands to run')
    
        args = parser.parse_args()
        username = args.username
        password = args.password
        hostlist = args.hostlist
        commands = args.commands
    

    【讨论】:

    • 如果您选择回答自己的问题,您应该解释导致您的问题的问题所在。另外,你应该接受一个答案:)
    【解决方案3】:

    它对我有用:

    import optparse
    
    
    parser = optparse.OptionParser('usage%prog'+'-username <username>'+'-password<pass> '+' -localhost<localhost>' +'-commands <commands> ')
    
    
    parser.add_option('-u', dest='username', help='The Username for authentication.')
    parser.add_option('-p', dest='password', help='The password for authentication.')
    parser.add_option('-l', dest='hostlist', help='List of devices to interact with.')
    parser.add_option('-c', dest='commands', help='An exact list of commands to run')
    
    (options,args) = parser.parse_args()
    
    username = options.username
    password = options.password
    hostlist = options.hostlist
    commands = options.commands
    
    print username,password,hostlist,commands
    

    python ssh.py -u admin -p 密码 -l '192.168.1.1, 192.168.1.2' -c 'uname -a',whoami


    输出:

    admin password 192.168.1.1,192.168.1.2 uname -a,whoami
    

    注意 1:您可以在我的代码中将 -username 替换为 -u 然后您应该输入:

    python ssh.py --username(和其他选项)

    note2:您使用了 (192.168.1.1, 192.168.1.2) 和 (uname -a),因为 ips 中有空格,而 (-a) 在 ( uname -a) 你的程序有问题来解决它你有两种方法:

    1) 删除空间使用 (uname -a) 或 (192.168.1.1,192.168.1.2)
    2) 使用引号 ('192.168.1.1, 192.168.1.2') 而不是 (192.168.1.1, 192.168.1.2)

    【讨论】:

      【解决方案4】:

      我想你可能会在MOTW article 专用于argparse 中找到答案。

      我对使用这个模块不是很有经验,但据我了解,你应该使用类似的东西:

      parser.add_argument('-u', '-username',
                          action='store',         # tell to store a value
                          dest='username',        # use `username` to access value
                          help='The Username for authentication.')
      
      args = parser.parse_args()
      username = args.username                    # u, username = ... should raise unpacking error
                                                  # as pointed out by hpaulj in comment
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-13
        • 2011-12-05
        • 1970-01-01
        • 2022-12-20
        • 2020-08-19
        • 2021-05-16
        • 2020-06-16
        • 2019-02-16
        相关资源
        最近更新 更多