2014-07-09 2 views
0

마지막 x 일 동안 수행 된 AWS EC2 스냅 샷을 확인하는 데 사용할 수있는 빠른 스크립트를 작성하려고합니다. 내가 명령 줄에서subprocess.call 및 os.system return not found

/usr/local/bin/aws --profile dummydata0 ec2 describe-snapshots --owner-ids 000000000000 --filters Name=start-time,Values=2014-07-08* 

를 실행

/bin/sh: 1: /usr/local/bin/aws --profile dummydata0 ec2 describe-snapshots --owner-ids 000000000000 --filters Name=start-time,Values=2014-07-08*: not found 

의 출력 오류가 발생하는 동안

잘 작동, 그래서 난 내 기본 리눅스 이해 여기에 아래로 떨어지고있다 같은데요.

call_snapshots = '"/usr/local/bin/aws --profile {0} ec2 describe-snapshots --owner-ids {1} --filters Name=start-time,Values={2}"'.format((key), (environment[key]), (date_string)) 

그래서 쉘이 받게 될 것이라고 실제 명령은 다음과 같습니다

여기 당신은 문자열 안에 따옴표 한 쌍을 사용하여 명령 줄에서 전체 실행에 내 스크립트 python ./script.py

#!/usr/bin/env python 
import subprocess 
import datetime 

# Create your views here. 

def main(numdays): 
     base = datetime.date.today() 
     date_list = [base - datetime.timedelta(days=x) for x in range(0, numdays)] 
     environment = {'dummydata0':'000000000000', 'dummydata1':'111111111111', 'dummydata2':'222222222222'} 
     data = [] 
     for date in date_list: 
       date_string = str(date) + "*" 
       # Python 3 prefers .values to .itervalues 
       for key in environment: 
         call_snapshots = '"/usr/local/bin/aws --profile {0} ec2 describe-snapshots --owner-ids {1} --filters Name=start-time,Values={2}"'.format((key), (environment[key]), (date_string)) 
         return subprocess.call(call_snapshots, shell=True) 

main(7) 
+0

를 사용해 볼 수 있습니까? https://docs.python.org/2/library/subprocess.html#subprocess.Popen – praveen

답변

1

입니다 :

"/usr/local/bin/aws --profile ... etc." 

그리고 이러한 인용문은 전체 항목을 하나의 항목으로 표시합니다. aws이라는 프로그램은 찾지 않지만 프로그램 이름이 aws --profile ....이고 작동하지 않습니다.

당신은 제대로 (shlex.quote로 변경 파이썬 3) 귀하의 인수 인용 pipes.quote를 사용하여이 문제를 해결할 수 있습니다, 쉘을 피하고리스트로 인수를 전달하여

call_snapshots = '/usr/local/bin/aws --profile {0} ec2 describe-snapshots --owner-ids {1} --filters Name=start-time,Values={2}'.format(
    *map(pipes.quote, (key, environment[key], date_string))) 
return subprocess.call(call_snapshots, shell=True) 

또는 더 나은 :

call_snapshots = ['/usr/local/bin/aws', 
    '--profile', key, 'ec2', 'describe-snapshots', '--owner-ids', environment[key], 
    '--filters', 'Name=start-time,Values=' + date_string] 
return subprocess.call(call_snapshots) 

[그리고 AWS는 이런 종류의 일을위한 파이썬 API가없는?] 당신이 subprocess.Popen를 사용

+0

우수, 목록으로 인수가 내 선호하는 옵션이었고 완벽하게 작동합니다. 예, Boto라고 부르지 만, 나는 그걸로 정말 싸웠고, CLI 도구처럼 합리적인 노력을 기울일 수 없었습니다. – richardnpaul