Pythonを使ってs3からGoogle Cloud Storageにデータを移す際、以前下記の二つの方法を書きましたが、やはりgsutil
を使うとs3から自分のサーバーを経由せずに直接Google Cloud Storageにコピーできるので便利です。
- Python(boto)でAmazon S3にあるデータをGoogle Cloud Storageへコピーする
- Python(boto)からサービスアカウントとキーファイル(p12)を使ってGoogle Cloud Storageにアクセスする
gsutilの設定ファイル
ドキュメントを参考に、GSUtilの実行時に読み込む設定ファイルを作っておきます。最低限[Credentials]や[GSUtil]は必要ですね。
[Credentials]
gs_service_key_file = /path.to/sample-KEYFILE.p12
gs_service_client_id = sample-service-account@developer.gserviceaccount.com
aws_access_key_id = AXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = sampleawssecretaccesskey1234
[Boto]
https_validate_certificates = True
[GSUtil]
content_language = ja
default_api_version = 2
default_project_id = sampleproject-994
Pythonからコマンドを実行する
コマンドの実行にはos.system
、commands
、subprocess
がありますがsubprocess
を使うことが推奨されています。
os.system
とcommands
は非推奨
os.system
subprocess モジュールが、新しいプロセスを実行して結果を取得するための、より強力な機能を提供しています。この関数の代わりに、 subprocess モジュールを利用することが推奨されています。1
commands
バージョン 2.6 で撤廃: commands モジュールは Python 3.0 で削除されました。 代わりに subprocess モジュールを使ってください。2
subprocess
を使う
import os
import subprocess
import shlex
BOTO_PATH = '/path.to/boto.ini'
cmd = 'gsutil cp s3://bucket/name gs://bucket/name'
popen = subprocess.Popen(
shlex.split(cmd),
stdout=subprocess.PIPE,
env={'BOTO_PATH': BOTO_PATH, 'PATH': os.getenv('PATH')})
output = popen.communicate()[0]
print output
ポイントはBOTO_PATHの指定です。通常gsutil
はデフォルトではホームディレクトリの.botoという設定ファイルを見て実行しますが、BOTO_PATH
やBOTO_CONFIG
という環境変数を指定するとそこに指定されているファイルを見に行きます。
subprocess.Popen
はenv
という引数に環境変数を指定できるのでdictのキーに'BOTO_PATH'を指定して、値に設定ファイルのパスを入れています。env
を指定する場合は必要な環境変数を全て与えなければいけないため、'PATH'も指定しています。
env を特定の値として与える場合、プログラムを実行するのに必要な変数全てを与えなければなりません。 Windows で side-by-side assembly を実行するためには、 env は正しい SystemRoot を 含まなければいけません 。3