subprocess - 在 python 脚本中运行 gcloud auth 和 gsutil 命令
问题描述
我正在尝试使用子进程在 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)
解决方案
您没有收到任何错误,因为您没有捕获打印错误的输出流,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
ing 进入目录并在 shell 脚本中使用相对路径;尽可能使用绝对路径。
推荐阅读
- finite-automata - 此 DFA 是否已最小化?
- python - 如何在没有预定义的多词列表的情况下识别句子中的多词表达
- typo3 - TYPO3 FileReference 不会将表名保存在数据库中。在 TYPO3 上从前端上传文件
- javascript - 使用 React 和 Laravel 搜索表
- android - 从一个应用到另一个应用的 Firebase 云消息传递
- maven - 未找到 Maven 阴影输出
- java - Java Map with TimeToLive 与每个键/值对相关联
- python - PyQt 使 QFrame 出现在另一个小部件的顶部
- amazon-s3 - 修改 S3 的 CloudFront 源请求
- java - Jenkinsfile 路径位置“@2 转换为 %402”并且构建失败