在Windows环境下使用Google Storage Python Library

标签:Google, Google Storage, Python

昨天看了一天Google Storage for Developers的文档,可惜被GSUtil Tool给拦住了。这玩意需要Linux环境,在Windows下则要Cygwin,可我用Cygwin运行时老提示Python打不开文件。
而根据Python Library文档,这玩意也需要GSUtil Tool,这让人情何以堪…

好在我翻了下源码,发现gsutil里面有个cloudreader文件夹,这是一个Google App Engine项目。
于是读了下说明文件,配置了boto.cfg,接着本地运行了一下,发现居然成功了。
接着读了下代码,便知道原因了:
import os

# Point to our boto.cfg before importing boto, because boto statically
# initializes credentials when its loaded.
os.environ['BOTO_CONFIG'] = 'boto.cfg'
其实boto这个玩意会读取配置文件,文档里写的是.boto,但是这个文件的绝对路径Python打不开。不过boto还会将os.environ['BOTO_CONFIG']作为配置文件,而这个路径是可以打开的。
此外还有篇《Google Storage for Developers on App Engine Python》也提到了这个问题,他的解决办法是在程序里手动配置:
config = boto.config
config.add_section('Credentials')
config.set('Credentials', 'gs_access_key_id', 'YOURACCESSKEY')
config.set('Credentials', 'gs_secret_access_key', 'YOURSECRETKEY')

接着我又脱离了Google App Engine,直接运行了一下,发现也是可以的。
不过文档里的有些例子需要注意,例如Get object and bucket metadata用的是s3的接口,gs并没有bucket.get_acl().acl.grants。

最后分享一个函数,这个被Google改造过的boto没有文档,用起来还得读源码…
import os
os.environ['BOTO_CONFIG'] = 'boto.cfg'
import boto


def upload(bucket, filename, content, mime_type=None, is_public=True):
  bucket_uri = boto.storage_uri(bucket, 'gs')

  object_uri = bucket_uri.clone_replace_name(filename)

  object_key = object_uri.new_key()

  headers = {}

  if mime_type:
    headers['Content-Type'] = mime_type

  if is_public:
    headers['x-goog-acl'] = 'public-read'

  object_key.set_contents_from_string(content, headers)

  if is_public:
    if '.' in bucket:
      template = 'http://%s/%s'
    else:
      template = 'https://%s.commondatastorage.googleapis.com/%s'
  else:
    template = 'https://sandbox.google.com/storage/%s/%s'

  return template % (bucket, filename)


print upload('keakon', 'test.txt', 'ooxx', 'text/plain')
顺便写了个上传文件的页面。

2条评论 你不来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?