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パスとして使用されます。

これは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)

行を変更せずに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

たぶんaws、bashコマンドは.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()

関連情報