我需要在我的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之后。如何实现?
答案 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
调用的参数,而不需要清理。