2014-06-11 3 views
1

같은하위 프로세스는 ESXCLI 네임 스페이스에게 내가 명령, 명령 줄에서 ESXCLI를 실행하면 제대로

esxcli --server=222.222.222.222 [email protected] --password='bar' --vihost=111.111.111.111 network vswitch standard portgroup add -p vlan1 -v switch1 

잘 작동 인쇄되지 않습니다. 그러나 하위 프로세스에서 호출하면 네임 스페이스를 인식 할 수 없으므로 항상 실패합니다. 이는 이름 공간과 명령을 따옴표로 묶어 직접 추가하는 것이 아니기 때문입니다. 서브 프로세스 호출에서 내 현재 코드입니다 : 내가 subprocess.list2cmdline을 실행하면

import settings 
import subprocess 

subprocess.call(["esxcli", 
       "--server="+ settings.vserver, 
       "--username="+ settings.user, 
       "--password=\'"+ settings.pwd + "\'", 
       "--vihost="+ settings.host, 
       "network vswitch standard portgroup add", 
       "-p "+ settings.newpgname, 
       "-v "+ settings.newpgswitch]) 

, 내가 얻을 :

esxcli --server=222.222.222.222 [email protected] --password='bar' --vihost=111.111.111.111 "network vswitch standard portgroup add" "-p vlan1" "-v switch1" 

참고 네임 스페이스와 그 이후의 인수가 모든 견적에 있음.

서브 프로세스에 대한 대부분의 질문은 shell = True를 처리하며 하이픈없는 접두어가 붙지 않는 인수에 대해서는 다루지 않습니다.

서브 프로세스를 추가 따옴표없이 올바른 명령을 실행하려면 어떻게합니까?

+0

대신 오래된 os.system 호출을 대신 사용했습니다. – Magitrek

+0

올바른 인수 목록이 어떻게 보이는지 보려면'shlex.split (shell_command) '를 호출하십시오. – jfs

답변

2

코드에서 실행 파일의 다섯 번째 인수는 "network vswitch 표준 포트 그룹 추가" 문자열이어야합니다. 커맨드 라인에서이를 전달하기 위해서는 그것을 인용해야합니다. 대신 커맨드 라인에있는 것처럼 별도의 인수로 만들어야합니다. 플래그 인수에도 똑같이 적용됩니다. 실행 파일은 단일 인수 "-v switch1"이 아니라 두 개의 인수 "-v""switch1"을 기대합니다. 따라서 다음을 수행해야합니다.

subprocess.call(["esxcli", 
       "--server="+settings.vserver, 
       "--username="+settings.user, 
       "--password="+settings.pwd, 
       "--vihost="+settings.host, 
       "network","vswitch","standard","portgroup","add", 
       "-p",settings.newpgname, 
       "-v",settings.newpgswitch]) 
+0

올바르지 않습니다. 하나의 명령 줄 인수 <-> 하나의 목록 항목, 즉 OP가 이미 "network vswitch .."인수를 올바르게 지정해야합니다. 다른 오류 (예 : 잘못된 따옴표)가있을 경우''--password ", setting.pwd' (따옴표 제외) 여야합니다. – jfs

+0

@ J.F.Sebastian 나는 잘 모르겠습니다. 명령 줄 인수 당 하나의 목록 항목이 있어야한다면 반드시 네트워크 vswitch가 아닌 "" "network", "vswitch", "standard", "portgroup", "add"다섯 요소를 포함해야합니다. 표준 포트 그룹 추가 ", 맞죠? 그리고 나는'--password ', setting.pwd'에 동의 할 의향이 있지만 OP는 원래의 명령에'--password ='bar ''를 포함 시켰기 때문에 이것은 정당 할 것입니다. 하나의 명령 줄 인수, 나는 그 스타일을 보존. –

+0

내 실수로, 나는 첫 번째 줄 대신 두 번째 줄 (따옴표로 묶음)을 보았다. 'subprocess'가 기본적으로 쉘을 시작하지 않기 때문에'bar' 주위의 따옴표를 제거해야합니다 (명령에 잘못된 암호를 전달하는 경우). – jfs