web-dev-qa-db-ja.com

bash変数をbashのpython引数として渡すことができません

何らかの理由で、bash変数$FOLDERを次のコードのpython引数として渡すことができません。pythonスクリプトは、Amazon s3からいくつかのファイルをダウンロードします。

Bashスクリプト:

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

$FOLDERの出力は再生成された日付です。パスとして使用される2014/07/31/14-16-34

pythonスクリプト:

#!/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)

python /data/pythonscript.py $FOLDER行を変更せずにbashスクリプトを実行すると、次の出力が得られます。

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
4
Bris

おそらく、aws bashコマンドは、print()では表示されない印刷不可能な文字を返しています。 trで削除してみてください:

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

_$FOLDER_を二重引用符で囲みます。

_python script.py "$FOLDER"
_

スクリプトの最初の行を次のように変更します

_#!/usr/bin/env python
_

これはうまくいくはずです。

そして、あなたの質問をより明確にしてください。

@ drs が言ったように、あなたの質問はまだ不完全です:

  • あなたの例はまだ漠然としていて、スクリプトの正しい名前は何であるかなど、欠点があります。それはpythonscriptまたは_s3download_ですか?
  • bucket.get_location()の値が空白になっているはずですが、「期待どおりに機能しますか」?
2
Brandt