我是subprocess的新手,我正在尝试使用subprocess.call
代替os.system
。该命令在os.system:
os.system('cluster submit {} gs://{}/{}'.format(cluster_name, bucket, file))
如何转化为subprocess
?我尝试了以下但没有奏效:
subprocess.call(["cluster", "submit", "{}", "gs://{}/{}".format(cluster_name, bucket, file)]).strip()
subprocess.call(["cluster", "submit", "{}", "gs://{}/{}".format(cluster_name, bucket_name, script)], shell=True).strip()
答案 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)
])