如何格式化subprocess.call()语句?

时间:2017-09-29 16:10:11

标签: python subprocess

我是subprocess的新手,我正在尝试使用subprocess.call代替os.system。该命令在os.system:

中看起来像这样

os.system('cluster submit {} gs://{}/{}'.format(cluster_name, bucket, file))

如何转化为subprocess?我尝试了以下但没有奏效:

  1. subprocess.call(["cluster", "submit", "{}", "gs://{}/{}".format(cluster_name, bucket, file)]).strip()

  2. subprocess.call(["cluster", "submit", "{}", "gs://{}/{}".format(cluster_name, bucket_name, script)], shell=True).strip()

2 个答案:

答案 0 :(得分:2)

首先,看看the docs for subprocess.call

  

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

     

运行args描述的命令。等待命令完成,然后返回returncode属性。

该命令返回进程返回代码,这是一个整数,因此您尝试调用subprocess.call(...).strip()将失败。如果您需要命令的输出,则需要:

  

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)

     

使用参数运行命令并将其输出作为字节字符串返回。

这会给你:

output = subprocess.call(["cluster", "submit", "{}", 
    "gs://{}/{}".format(cluster_name, bucket, file)]).strip()

但是那里有一些基本的Python问题,因为你有一个"{}",你调用.format,然后你就得{ {1}}只有两个格式标记但有三个参数。你想要更像的东西:

"gs://{}/{}"

当您使用output = subprocess.call(["cluster", "submit", cluster_name, "gs://{}/{}".format(bucket, file)]).strip() 时,如第二个示例中所示,您将传递字符串而不是列表。 E.g:

shell=True

答案 1 :(得分:1)

subprocess.call([
  "cluster",
  "submit",
  str(cluster_name),
  "gs://{}/{}".format(bucket_name, script)
])