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

标签 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 使用“top”命令)但没有任何附加(我检查内存使用情况和 cpu 使用情况通常非常高,但在这种情况下不是)。 任何机构有任何想法吗?

最佳答案

stdout=subprocess.PIPE

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

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

编辑:

如果您希望将输出重定向到/dev/null,考虑到您是通过 shell (shell=True) 启动命令的事实,最简单的解决方案是附加 >/dev/nullcmd 字符串。如果它也打印到​​ 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)

关于python - 通过子进程库使用 python 执行进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21600091/

相关文章:

python - 检索 subprocess.call() 的输出

python - 如何找到线段上距离任意点最近的点?

python - 如何制作良好的可重复 Pandas 示例

linux - 无法在 Vagrant 上使用版本 2 docker-compose 文件

linux - 带有 sed 文本文件的 For 循环

python - 当多个参数包含空格时如何使用子进程?

python - 用子进程替换 commands.getoutput

python - 我如何用 Ruby/Python 编写这个?或者,你能把我的 LINQ 翻译成 Ruby/Python 吗?

python - Pandas模糊组汇总统计

linux - 在 bash 脚本中进行数学计算