【问题标题】:Run gcloud auth and gsutil commands in a python script在 python 脚本中运行 gcloud auth 和 gsutil 命令
【发布时间】:2021-08-30 16:53:10
【问题描述】:

我正在尝试使用子进程在 python 脚本中运行三个 shell 命令。我在其他线程上找到了一些代码。我没有收到任何错误,但文件没有上传到存储桶。如果我打开一个 cmd 窗口并输入所有三个文件,则该文件成功推送到存储桶。我正在使用 Python 3.6。

a = 'gcloud auth activate-service-account --key-file=C:\key\key.json'
b = 'cd C:\requests'
c = 'gsutil cp *.txt gs://request/upload/'

command = a; b; c

subprocess.run(command, stdout=subprocess.PIPE, shell=True)

【问题讨论】:

  • 请考虑使用 Python 的 Cloud Storage 客户端库,而不是子进程。正如您所发现的,在子 shell 中调用命令具有挑战性。见:cloud.google.com/storage/docs/reference/libraries
  • 删除命令b。在命令c 中使用完整路径名。

标签: subprocess gcloud gsutil


【解决方案1】:

您没有收到任何错误,因为您没有捕获打印错误的输出流stderr。 Python 3.7+ 还要求 capture_output 参数为真,但看起来您使用的是 Python 3.6。

另外,看看这一行:

command = a; b; c

您将a 中的字符串存储到变量command 中。然后,您只是评估接下来的两个字符串,它基本上什么都不做;即该行正在执行三个语句:

command = a
b
c

我认为您可能想将它们连接成一个字符串并将其作为第一个参数传递给subprocess.run()

command = '{0}; {1}; {2}'.format(a, b, c)

另外,还有两点需要注意:

  • 如果一个命令依赖于前一个成功的命令,您应该使用&& 而不是; 加入您的命令。
  • 通常不应依赖cd 进入目录并在shell 脚本中使用相对路径;尽可能使用绝对路径。

【讨论】:

  • 哦,我明白了。是的,它们依赖于前一个的成功。那会是 command = '{0} && {1} && {2}'.format(a, b, c) 吗?谢谢。
  • 我删除了 'b' 行,并在 c 部分使用了文本文件的完整路径名。我试过 command = '{0} && {1}'.format(a, c) 和 command = '{0}; {1}'.format(a, c) 没有错误,但文件未上传到存储桶。
  • 如果您通过子进程管道同时获取 stdout 和 stderr 的输出,那应该会为您提供更多信息。如果你没有从任何一个流中得到任何输出,你的命令可能没有被执行。
  • @Andrew 您的问题显示了 Windows 路径。 Windows 不支持&&,这是一个 Linux shell 功能。
猜你喜欢
  • 1970-01-01
  • 2016-07-25
  • 2018-06-09
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多