Argparse将命令行字符串传递给变量python3

时间:2017-08-20 20:50:31

标签: python python-3.x list argparse

我已经阅读了argparse docs,我正在尝试创建一个接受命令行参数的程序,并将这些值传递给变量,如下所示:

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 :(得分:1)

它对我有用:

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

答案 3 :(得分:0)

我猜您可以在专属于argparse的{​​{3}}中找到答案。

我使用这个模块的经验不是很多,但据我所知,你应该使用类似的东西:

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