gsutil 的 subprocess.Popen 出现语法错误

Posted

技术标签:

【中文标题】gsutil 的 subprocess.Popen 出现语法错误【英文标题】:gsutil got an syntax error with subprocess.Popen 【发布时间】:2020-12-26 10:27:19 【问题描述】:

就我而言,我想将所有 pdf 文件上传到谷歌云存储。

所以我使用 google-sdk 和 pytho 子进程进行练习,而不是“google.cloud.storage API”。

但是下面有错误:

代码:

from subprocess import Popen

def subprocess_cmd(command):
    print(f'$>: command')
    process = Popen(command,
                    stdout=subprocess.PIPE,
                    executable='/bin/bash',
                    shell=True)

    proc_stdout = process.communicate()[0].strip()
    print(proc_stdout.decode("utf-8"))

执行功能

command = "gsutil -m cp -r ./source/*(.pdf|.PDF) gs://<bucket_name>"
subprocess_cmd(command)

错误

/bin/bash: -c: line 0: syntax error near unexpected token `('
/bin/bash: -c: line 0: `gsutil -m cp -r ./source/*(.pdf|.PDF) gs://<bucket_name>'

【问题讨论】:

无法使用/*(.pdf|.PDF) 运行命令,该命令将无法正常运行。我试图在我身边复制它,但我也无法使用它。考虑到这一点,支持将 GCS 与 Python 结合使用的方式是使用适用于 Python 的 Google Cloud 客户端库,而不是运行 gsutil。你能解释一下你为什么不使用它吗? 但是gsutil -m cp -r ./source/*(.pdf|.PDF) gs://&lt;bucket_name&gt; 在终端上工作 嗨@EEEEH 它可能有效,但不受支持 - 可能有效,因为gsutil 基于 Unix 环境 - 并且可能无法正常工作。除此之外,您能否澄清一下为什么不使用 Python 的 Google Cloud 客户端库而不是 Python 子进程? 嗨@gso_gabriel,我没有使用客户端库,因为我只想知道子进程。 【参考方案1】:

你应该改用这一行:

command = "gsutil -m cp -r ./source/*.pdf,*.PDF gs://<bucket_name>"

有关bash 通配符的信息,请参阅this document 中的 (curly brackets) 部分。您还可以看到this document 关于gsutil 通配符。

【讨论】:

以上是关于gsutil 的 subprocess.Popen 出现语法错误的主要内容,如果未能解决你的问题,请参考以下文章

如何从 python 脚本成功调用 gsutil rsync?

subprocess的popen函数

python subprocess.Popen

python subprocess.popen stdin.write

subprocess.Popen("echo $HOME"... 和 subprocess.Popen(["echo", "$HOME"]

subprocess.Popen 和缓冲的进程输出