2013-07-21 5 views
1

꽤 많이 google했습니다. 그리고 vars()를 사용하여 제안한 argparse 설명서를 읽으십시오. 예상대로 네임 스페이스 위반이 발생합니다.이 문제와 관련된 경로를 파악할 수 없습니다.python argparse : 목록에 대한 값으로 인수 사용

기본적으로 argparse 다중 값 인수를 사용하여 for 루프를 실행할 수 있도록 해당 값의 목록을 만들고 싶습니다. 이는 VNX 배열과 인터페이스하여 모든 개발자 환경에서 데이터 스냅 샷을 재설정하는 것입니다.

명령을 실행하면 argparse가 값을 올바르게 받고 있지만 이름 공간 예외가 발생하고 실제로 인수 값을 사용하지 않는 것을 볼 수 있습니다.

지도에 대해 많은 감사를 드리며 더 나은 문서에 대한 링크를 통해 문제를 더 잘 설명 할 수 있습니다. 나는이 문제를 안다. 어떻게 해결할 것인가? 나는 문법적으로이 글을 읽으려면 (또는 구글) 무엇을 읽어야할지 모르겠다.

[[email protected] tmp]# ./envrestore.py -e dev1 dev2 dev3

Namespace(myenv=['dev1', 'dev2', 'dev3'])

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

[[email protected] 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() 

답변

1

내가 믿는 문제는 myenv로 전달하는 것입니다 너는

myenv = parser.parse_args().myenv 

건배!

+0

대단히 감사드립니다. [[email protected] tmp] # ./envrestore.py -e dev1 naviseccli -secfilepath/opt/Navisphere/blah -h vnx.lipsum.com snap -create -res 3 -name mongo01-dev1-snap - allowReadWrite yes naviseccli -secfilepath/opt/Navisphere/blah -h vnx.lipsum.com 스냅 -create -res 4 -name mysql01-dev1-snap -allowReadWrite 예 – jed

1

myenvargparse.Namespace 인스턴스 자체입니다 :

이 내가 코드를 실행할 때 내가 무엇을 얻을 수 있습니다. 값이 인의 값을 얻으려면 myenv.myenv을 사용하십시오.

for e in myenv.myenv: 
    print(e) 

또는 코드를 명확하게는, 그렇지 않으면 Namespace 뭔가 이름을 만들려면 : 내가 생각

myenv = parser.parse_args() 

:

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

정말 고마워요, 항상 무언가 너무 간단합니다. 당신의 도움 없이는 제가 생각한 것 같지 않습니다. 당신의 방법은 완벽하게 작동합니다. 그러나 for 루프 클리너를 유지할 수 있기 때문에 Jblasco와 함께갔습니다. 다시 한번 감사드립니다! – jed