我已经google了很多,并阅读了我认为建议使用vars()的argparse文档。我按预期得到了命名空间违规,我只是无法弄清楚这个问题的路径。
本质上,我想获取一个argparse多值参数并从这些值创建一个列表,这样我就可以通过它们运行for循环。这是为了与我们的VNX阵列连接,以重置所有开发人员环境中的数据快照。
当我运行命令时,我可以看到argparse正确获取值,但它抛出了Namespace异常,而不是实际使用参数的值。
非常感谢任何指导,甚至是与更好地解释我的问题的更好的文档的链接。我知道这个问题,以及我想如何修复它,我只是不确定甚至可以阅读(或谷歌)来解决这种语法问题?
这是我运行代码时得到的结果:
[root@robot.lipsum.com tmp]#。/ envrestore.py -e dev1 dev2 dev3
命名空间(myenv = ['dev1','dev2','dev3'])
回溯(最近一次调用最后一次):文件“./envrestore.py”,第43行,中 run_create_snap()文件“./envrestore.py”,第36行,在run_create_snap中 for my in myenv:TypeError:'Namespace'对象不可迭代
[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()
答案 0 :(得分:1)
myenv
是argparse.Namespace
实例本身。要获取名为myenv
的选项中的值,请使用myenv.myenv
。
for e in myenv.myenv:
print(e)
或者,为了使代码更清晰,请将Namespace
命名为其他内容:
args = parser.parse_args()
for e in args.myenv:
...
答案 1 :(得分:1)
我认为问题在于你作为myenv传递的内容:
myenv = parser.parse_args()
我认为你的意思是
myenv = parser.parse_args().myenv
干杯!