Python:带有参数和路径的subprocess.Popen

时间:2015-01-26 09:56:05

标签: python

我需要在我的python脚本中执行这一行:

p = subprocess.Popen(["python ~/mrjobScript.py ~/jobs/"+date+"/input/* > ~/jobs/"+date+"/output/output-"+domain+".log","--domain "+domain],stdout=subprocess.PIPE, shell=True)

然而, - domain切换应该在mrjobScript.py之后。如何实现?

2 个答案:

答案 0 :(得分:2)

您不使用shell = True的列表,您还应该将输出重定向到文件以将其保存到文件中。

import os
from subprocess import check_call
pt1 = os.path.expanduser("~/mrjobScript.py")
pt2 = os.path.expanduser("~/jobs/{}/input/*".format(date)

with open (os.path.expanduser("~/jobs/{}/output/output-{}.log".format(date,domain)),"w") as f:
     subprocess.check_call(["python",pt1,"--domain",domain,pt2],stdout=f)

答案 1 :(得分:1)

假设您的命令在命令行上运行,那么删除参数stdout,更改参数的顺序,传递字符串而不是列表应该足以使它重现命令的行为线。

import subprocess
subprocess.Popen("python ~/mrjobScript.py --domain {1} ~/jobs/{0}/input/* > ~/jobs/{0}/output/output-{1}.log ".format(date,domain), shell=True)

请注意,这将启动子进程,然后转到代码的下一行。您的代码不会等待它。如果您希望代码等待它,您可能希望使用subprocess.call。

警告提示:建议shell=True的用户咨询this answer以充分了解此类用法的含义。特别是,这样的应用程序永远不应该让用户提供的参数直接或间接地传递给subprocess.Popen shell=True调用的参数,而不需要清理。