bash에서 bash 변수를 Python 인수로 전달할 수 없습니다.

bash에서 bash 변수를 Python 인수로 전달할 수 없습니다.

$FOLDER어떤 이유로 다음 코드에서는 bash 변수를 Python 매개 변수로 전달할 수 없습니다. Amazon s3에서 일부 파일을 다운로드하는 Python 스크립트입니다.

쿵쿵 스크립트:

#!/bin/bash
FOLDER=$(./aws get $BUCKET"/location.txt")
python /data/pythonscript.py $FOLDER
#

출력은 $FOLDER재생성된 날짜입니다. 2014/07/31/14-16-34경로로 사용됩니다.

이것은 파이썬 스크립트입니다:

#!/usr/bin/python

import boto, sys
from boto.s3.connection import S3Connection

access_key = 'accesskey'
secret_key = 'secretkey'
bucket_name = 'a name'
folder_path =  str(sys.argv[1]) if len(sys.argv) > 1 else ''

print("Forwarded folder path " + folder_path)

conn = S3Connection(access_key, secret_key)
bucket = conn.get_bucket(bucket_name)

print("Bucket Location:" + bucket.get_location())

for key in bucket.list(prefix=folder_path, delimiter=''):
        if '.' in key.name:
                file_name = key.name[len(folder_path)+1:]
                print("Downloading file " + file_name)
                key.get_contents_to_filename('/data/temp/' + file_name)

줄을 변경하지 않고 bash 스크립트를 실행하면 python /data/pythonscript.py $FOLDER다음과 같은 결과가 나타납니다.

Forwarded folder path 2014/07/31/14-16-34 
Buckect Location: 

하지만 다음으로 변경하면 python /data/pythonscript.py 2014/07/31/14-16-34모든 것이 잘 작동합니다.

Forwarded folder path 2014/07/31/14-16-34
Bucket Location: 
Downloading 2014/07/31/14-16-34/FacetedSearch.zip 
Downloading file FacetedSearch.zip
Downloading 2014/07/31/14-16-34/Location.zip
Downloading file Location.zip
Downloading 2014/07/31/14-16-34/LocationPage.zip
Downloading file LocationPage.zip

답변1

어쩌면 awsbash 명령이 .txt에 표시되지 않는 인쇄할 수 없는 문자를 반환할 수도 있습니다 print(). 다음 명령을 사용하여 제거해 보십시오 tr.

FOLDER=$(./aws get $BUCKET"/location.txt" | tr -cd "[:print:]")

답변2

큰따옴표를 넣어보세요 $FOLDER:

python script.py "$FOLDER"

스크립트의 첫 번째 줄을 다음으로 변경합니다.

#!/usr/bin/env python

이것은 작동합니다.

귀하의 질문에 더 명확하게 대답하십시오.

~처럼@drs귀하의 질문이 아직 불완전하다고 가정해 보겠습니다.

  • 귀하의 예는 여전히 모호하고 스크립트의 정확한 이름이 무엇입니까? 예 pythonscript또는 아니오 와 같은 결함이 있습니다 s3download.
  • "예상대로 작동합니다" 값이 비어 있어야 합니까 bucket.get_location()?

관련 정보