python中的gsutil cp通过os.system

Posted

技术标签:

【中文标题】python中的gsutil cp通过os.system【英文标题】:gsutil cp in python via os.system 【发布时间】:2019-01-01 17:03:30 【问题描述】:

我想将本地文件复制到谷歌云存储桶。我可以在命令行中使用gsutil cp 来做到这一点。但我想在 python 中执行此操作,因此要在 python 中运行类似的命令,我使用以下行:

os.system('gsutil cp '+ '/MY-LOCAL-FILE-NAME' +' gs://My-Bucket-Name')

它将文件发送到存储桶,但它是一个空文件!!! 我也尝试了 python 子进程但同样的问题。 我认为问题在于字符串连接。当我使用整个字符串时,它可以工作并将文件发送到存储桶,但是当我在 "subprocess" 或 "os.system" 中连接子字符串时,它只发送一个空文件,这太奇怪了,有什么想法吗???

【问题讨论】:

文件与您的 python 脚本位于同一路径这一事实毫无意义。 当前工作目录意味着一切。 谢谢,我其实知道。例如,当我使用简单的 os.system('cp ...') 命令时它可以工作,但是对于 os.system('gsutil cp...') 我得到上述错误,我不知道为什么使用 gsutil 它没有不行吗? 您有什么理由不为此目的使用 Python 库吗? cloud.google.com/storage/docs/reference/… 我同意 @ScottMcC 的观点,使用 Python 的 GCS 库会容易得多。有使用命令行的理由吗? 我希望我的代码尽可能独立于平台,这就是我尽量避免使用 GCS 库的原因。实际上我发现这是因为 python/subprocess/os.system 字符串连接的问题。当我在没有任何连接(+)的情况下使用整个字符串时,它可以工作并将文件发送到存储桶,但是当我将子字符串连接在一起时,它不起作用,它只是将一个空文件发送到存储桶,任何关于原因的想法都很奇怪?谢谢 【参考方案1】:

您可以从 Gcloud github 获得 snippets,其中有一个是您感兴趣的:

def upload_blob(bucket_name, source_file_name, destination_blob_name):
"""Uploads a file to the bucket."""
     storage_client = storage.Client()
     bucket = storage_client.get_bucket(bucket_name)
     blob = bucket.blob(destination_blob_name)

     blob.upload_from_filename(source_file_name)

print('File  uploaded to .'.format(
    source_file_name,
    destination_blob_name))

【讨论】:

断开的链接已损坏。 确实,sn-ps 刚刚被移动。更新了链接。发送

以上是关于python中的gsutil cp通过os.system的主要内容,如果未能解决你的问题,请参考以下文章

GSUTIL CP 文件延迟

Gsutil 同步与 cp -n

gsutil cp 失败 - “无法创建清单文件”

如何在忽略 .git、.gitignore 等文件的同时执行 gsutil cp -R?

gsutil - 使用联合用户 AWS 密钥时 cp、rsync 的问题

gsutil cp 创建嵌套目录