Help us understand the problem. What is going on with this article?

PythonからGSUtilを使ってS3のファイルをGCSにコピーする

More than 3 years have passed since last update.

Pythonを使ってs3からGoogle Cloud Storageにデータを移す際、以前下記の二つの方法を書きましたが、やはりgsutilを使うとs3から自分のサーバーを経由せずに直接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.systemcommandssubprocessがありますがsubprocessを使うことが推奨されています。

os.systemcommandsは非推奨

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_PATHBOTO_CONFIGという環境変数を指定するとそこに指定されているファイルを見に行きます。

subprocess.Popenenvという引数に環境変数を指定できるのでdictのキーに'BOTO_PATH'を指定して、値に設定ファイルのパスを入れています。envを指定する場合は必要な環境変数を全て与えなければいけないため、'PATH'も指定しています。

env を特定の値として与える場合、プログラムを実行するのに必要な変数全てを与えなければなりません。 Windows で side-by-side assembly を実行するためには、 env は正しい SystemRoot を 含まなければいけません 。3

itkr
おひさま
http://itkr.github.io
colorful-board
「すべての人々に、人生が変わる出会いを」をビジョンとして、これまで出会えなかった情報と瞬時に出会うことで人々の生活をより豊かにする、新しい情報発見のためのプラットフォームを目指しています。
https://sensy.ai/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした