【问题标题】:python argparse: use arguments as values for a listpython argparse:使用参数作为列表的值
【发布时间】:2013-07-22 01:03:24
【问题描述】:

我已经用谷歌搜索了很多,并阅读了我认为建议使用 vars() 的 argparse 文档。我得到了预期的命名空间违规,我只是想不出解决这个问题的路径。

本质上,我想采用 argparse 多值参数并从这些值创建一个列表,以便我可以通过它们运行 for 循环。这是为了与我们的 VNX 阵列交互,以重置所有开发人员环境中的数据快照。

当我运行命令时,我可以看到 argparse 正确地获取了值,但它抛出了命名空间异常并且没有实际使用参数的值。

非常感谢任何指导,甚至是一些更好的文档的链接,可以更好地解释我的问题。我知道这个问题,以及我想如何解决它,我只是不确定要读什么(或谷歌)来绕过这个语法?

这是我运行代码时得到的:

[root@robot.lipsum.com tmp]# ./envrestore.py -e dev1 dev2 dev3

命名空间(myenv=['dev1', 'dev2', 'dev3'])

Traceback(最近一次调用最后一次):文件“./envrestore.py”,第 43 行,在 run_create_snap() 文件“./envrestore.py”,第 36 行,在 run_create_snap for e in myenv: TypeError: 'Namespace' object is not iterable

[root@robot.lipsum.com tmp]#

#!/usr/bin/env python

import pexpect, sys, datetime, argparse, time
from fabric.api import *

parser = argparse.ArgumentParser()
parser.add_argument('-e', '--myenv', nargs='*', type=str)
print parser.parse_args()

array = "vnx.lipsum.com"
seckey = "/opt/Navisphere/blah"
myenv = parser.parse_args()
dbhosts = ['mongo01', 'mysql01']

# !! DO NOT CHANGE IDs !!
lunpnum = "0000000"
mongo_plunid = "3"
mysql_plunid = "4"

def delete_snap(env=myenv, host=dbhosts):
    child = pexpect.spawn('naviseccli -secfilepath %s -h %s snap -destroy -id %s-%s-snap' % (seckey, array, host, env))
    print child
    child.logfile = sys.stdout
    child.expect('Are you sure you want to perform this operation\?\(y\/n\):')
    child.sendline('n')

def create_snap(env=myenv, host=dbhosts, lunid=''):
    print "naviseccli -secfilepath %s -h %s snap -create -res %s -name %s-%s-snap -allowReadWrite yes" % (seckey, array, lunid, host, env)

def run_delete_snap():
    for e in myenv:
      for h in dbhosts:
        delete_snap(env=e, host=h)

def run_create_snap():
    for e in myenv:
      for h in dbhosts:
        if "mysql" in h:
          create_snap(env=e, host=h, lunid=mysql_plunid)
        elif "mongo" in h:
          create_snap(env=e, host=h, lunid=mongo_plunid)

run_create_snap()

【问题讨论】:

    标签: python list key-value argparse


    【解决方案1】:

    我相信问题出在你作为 myenv 传递的内容上:

    myenv = parser.parse_args()
    

    你的意思是

    myenv = parser.parse_args().myenv
    

    干杯!

    【讨论】:

    • 非常感谢,成功了。 [root@robot.lipsum.com tmp]# ./envrestore.py -e dev1 naviseccli -secfilepath /opt/Navisphere/blah -h vnx.lipsum.com snap -create -res 3 -name mongo01-dev1-snap -allowReadWrite是 naviseccli -secfilepath /opt/Navisphere/blah -h vnx.lipsum.com snap -create -res 4 -name mysql01-dev1-snap -allowReadWrite 是
    【解决方案2】:

    myenvargparse.Namespace 实例本身。要获取名为myenv选项 中的值,请使用myenv.myenv

    for e in myenv.myenv:
        print(e)
    

    或者,为了使代码更清晰,将 Namespace 命名为其他名称:

    args = parser.parse_args()
    for e in args.myenv:
       ...
    

    【讨论】:

    • 非常感谢,总是那么简单 - 如果没有你的帮助,我想我不会弄明白的。你的方法非常有效。但是,我选择了下面的 Jblasco,因为它可以让我保持 for 循环更清洁。再次非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2019-05-27
    • 2015-08-10
    • 1970-01-01
    • 2018-02-14
    • 2012-03-12
    • 1970-01-01
    • 2021-10-10
    相关资源
    最近更新 更多