回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我已经在google上读了不少,并阅读了argparse文档,我认为它建议使用vars()的一些东西。我得到的名称空间冲突如预期,我只是不知道如何解决这个问题。在</p>
<p>本质上,我希望使用一个argparse多值参数,并从这些值中创建一个列表,这样我就可以对它们运行for循环。这是为了与我们的VNX数组接口,以重置所有开发人员环境中的数据快照。在</p>
<p>当我运行这个命令时,我可以看到argparse正确地获取了值,但是它抛出了名称空间异常,并没有实际使用参数的值。在</p>
<p>非常感谢任何指导,甚至是一些更好的文档链接,可以更好地解释我的问题。我知道这个问题,我想如何解决它,我只是不知道该读什么(或谷歌)来绕过这个语法?在</p>
<p>这是我运行代码时得到的结果:</p>
<blockquote>
<p>[root@robot.lipsum.com tmp]# ./envrestore.py -e dev1 dev2 dev3</p>
<p>Namespace(myenv=['dev1', 'dev2', 'dev3']) </p>
<p>Traceback (most recent call last): File "./envrestore.py", line 43, in
run_create_snap() File "./envrestore.py", line 36, in run_create_snap
for e in myenv: TypeError: 'Namespace' object is not iterable </p>
<p>[root@robot.lipsum.com tmp]#</p>
</blockquote>
<pre><code>#!/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()
</code></pre>