通过子进程库使用python执行进程

时间:2014-02-06 10:23:39

标签: python linux subprocess popen

我刚刚在python中创建了一个软件,它应该从shell安排几个命令。 (ps:我正在使用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),但没有任何附加(我检查内存使用情况和CPU使用情况通常很高,但在这种情况下不是这样)。 任何机构都有任何想法吗?

2 个答案:

答案 0 :(得分:1)

stdout=subprocess.PIPE

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

您可以从中读取(如果您需要该流程创建的输出),或者完全删除重定向。

修改

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

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

如果你使用的是Python 3.3或更高版本,只需传递>/dev/null 2>&1常量:

subprocess.DEVNULL

如果没有,或者你想保持向后兼容性,只需打开/ dev / null并传递它:

subprocess.Popen(cmd, stdout=subprocess.DEVNULL, shell=True, preexec_fn=os.setsid)

答案 1 :(得分:0)

尝试以下

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