Python:subprocess.Popen,带参数和路径

Python:subprocess.Popen,带参数和路径,python,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之后。如何实现?如果不使用shell=T

我需要在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之后。如何实现?

如果不使用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)

如果不使用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)

如果不使用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)

如果不使用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)

假设您的命令在命令行上工作,那么删除参数
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
的用户进行咨询,以充分了解此类用法的含义。特别是,此类应用程序不应让用户提供的参数直接或间接地传递给调用
subprocess.Popen
的参数,且
shell=True
,而不进行清理。

假设您的命令在命令行上运行,然后删除参数
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
的用户进行咨询,以充分了解此类用法的含义。特别是,此类应用程序不应让用户提供的参数直接或间接地传递给调用
subprocess.Popen
的参数,且
shell=True
,而不进行清理。

假设您的命令在命令行上运行,然后删除参数
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
的用户进行咨询,以充分了解此类用法的含义。特别是,此类应用程序不应让用户提供的参数直接或间接地传递给调用
subprocess.Popen
的参数,且
shell=True
,而不进行清理。

假设您的命令在命令行上运行,然后删除参数
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
的用户进行咨询,以充分了解此类用法的含义。特别是,此类应用程序不应让用户提供的参数直接或间接地通过
shell=True
传递给调用
subprocess.Popen
的参数,而不进行清理。

不要使用shell=True将命令放入列表中,另外,
将输出重定向到文件对象也不起作用,因为您正试图用Python调用Python,因此只需导入目标模块并直接调用其函数可能更有意义。然后,您可以传递命令行参数,这比传递子进程和操作系统要自然得多。@merlin2011这不是mapreduce(mrjob)的选项,或者至少我不知道如何传递,因为会产生作业等等。@Padraic Cunningham
是mrjob语法,并且在CLI上工作。@sirbenji,
应该做什么?您的命令无论如何都是不正确的,您传递了一个shell=True的字符串,您想要一个单独参数的列表,如果您传递了一个列表,则不要使用shell=True,如果
--domain
应该在
mrjobScript.py
之后,那么is应该在后面。不要使用shell=True将命令放入列表中,另外,
将输出重定向到文件对象也不起作用,因为您正试图用Python调用Python,因此只需导入目标模块并直接调用其函数可能更有意义。然后,您可以传递命令行参数,这比传递子进程和操作系统要自然得多。@merlin2011这不是mapreduce(mrjob)的选项,或者至少我不知道如何传递,因为会产生作业等等。@Padraic Cunningham
是mrjob语法,并且在CLI上工作。@sirbenji,
应该做什么?您的命令无论如何都是不正确的,您传递了一个shell=True的字符串,您想要一个单独参数的列表,如果您传递了一个列表,则不要使用shell=True,如果
--domain
应该在
mrjobScript.py
之后,那么is应该在后面。不要使用shell=True将命令放入列表中,另外,
将输出重定向到文件object也不起作用,因为您试图用Py调用Python