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://<bucket_name>
在终端上工作
嗨@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?
python subprocess.popen stdin.write
subprocess.Popen("echo $HOME"... 和 subprocess.Popen(["echo", "$HOME"]