按子进程库使用python执行进程

按子进程库使用python执行进程,python,linux,subprocess,popen,Python,Linux,Subprocess,Popen,我刚刚用python创建了一个软件,它应该从shell调度几个命令。(附言:我在linux上工作) 顺便说一下,我创建了以下函数来启动流程: def exec_command(cmd): process = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid) pid = process.pid print '----------launched process with PID: ', p

我刚刚用python创建了一个软件,它应该从shell调度几个命令。(附言:我在linux上工作) 顺便说一下,我创建了以下函数来启动流程:

def exec_command(cmd):
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid)
pid = process.pid
print '----------launched process with PID: ', pid 
return pid
在此之后,我使用pid检查进程是否处于僵尸状态,在这种情况下,是否会杀死它。 有时,一切都很好,但有一种情况是,启动的流程没有任何作用。 我说的过程是:
sh/home/ubuntu/programs/data integration/kitchen.sh-file=/home/ubuntu/TrasformazioneAVM/JobAVM.kjb-level=Basic-param:processName=avm

如果我用shell启动它,一切都很好,但是如果我用我的函数启动它,我可以在系统监视器上看到进程(或者用shell的“top”命令),但是什么都没有出现(我检查内存使用和cpu使用情况,这通常是非常高的,但在这种情况下不是这样)。 有人有什么想法吗

stdout=subprocess.PIPE
罪魁祸首在这里。您正在将子进程输出重定向到管道,但您没有从该管道读取

您可以从中读取(如果需要进程创建的输出),也可以删除重定向

编辑:

如果您希望将输出重定向到/dev/null,考虑到您是通过shell(
shell=True
)启动命令,最简单的解决方案是将
/dev/null
附加到
cmd
字符串。如果它也打印到stderr,那么您需要
/dev/null 2>&1

更好的解决方案(不需要通过shell启动命令)如下所示:

如果您使用的是Python 3.3或更高版本,只需传递
subprocess.DEVNULL
常量:

subprocess.Popen(cmd, stdout=subprocess.DEVNULL, shell=True, preexec_fn=os.setsid)
如果没有,或者您想保持向后兼容性,只需打开/dev/null并传递它:

subprocess.Popen(cmd, stdout=open(os.devnull, "w"), shell=True, preexec_fn=os.setsid)
试试下面

def exec_command(cmd):
    cmd = cmd.split()
    process = subprocess.Popen(cmd, stdout=subprocess.PIPE, preexec_fn=os.setsid)
    pid = process.pid
    print '----------launched process with PID: ', pid 
    return pid

你能写下print CMD的输出吗?你说的“print CMD”是什么意思我的意思是你给cmd的是列表还是字符串这是字符串:sh/home/ubuntu/programs/data integration/kitchen.sh-file=/home/ubuntu/TrasformazioneAVM/JobAVM.kjb-level=Basic-param:processName=avmrelated:我想我必须创建一个管道,因为当我启动这个进程时,会生成许多PID,我想杀死其中一个所有的过程都连接在一起die@user2637212你不必使用管道来做这件事。这更像是一个副作用,孩子接收到SIGPIPE,一旦它试图写入另一端关闭的管道,它就会死亡。例如,您可以使用流程组。还记得在控制台中按^C会中断所有子项吗?它是通过向整个进程组发送SIGINT来实现的。您也可以这样做。那么您建议编写什么来代替stdout=subprocess.PIPE?@user2637212您需要程序打印的输出吗?如果您只需要自己查看,请删除stdout参数(或将其设置为None)。输出将被打印到shell中。如果您根本不需要输出,可以将其重定向到/dev/null,方法是打开它进行写入并传递结果文件对象。如果您的python脚本需要以某种方式解释输出(解析它,等等),那么会有点困难,这是一个完全不同的故事。正如你所说,它在我的外壳上打印输出。我想将其重定向到/dev/null。我该怎么做?反应如何