为什么杀死该子进程会引发ProcessLookupError?

初学者

我不知道何时需要终止子进程。

for package in server.packages:
    n = subprocess.Popen(['which', package], stdout=subprocess.DEVNULL)
    n.wait()
    if n.returncode != 0:
        n.kill()
        <some other code>

我收到错误消息(使用Python3):

ProcessLookupError: [Errno 3] No such process

有人可以解释我什么时候子进程自杀了,什么时候我需要手动杀死它?

陪替氏

在Python中,Popen.wait是一个等待子进程终止的阻塞调用。因此,通常在调用return之后无需杀死子进程wait请参阅Popen.wait()上的Python文档

现在,如果您了解了它的工作原理,则可以看到代码失败,因为在某些时候Popen.returncode返回一个非零值,然后尝试杀死一个不再存在的进程。

这就是为什么ProcessLookupError提高a的原因

现在,如此处另一个答案所指出的那样,返回的值可能是None,这表明子进程可能存在(也许是特定于OS的)问题,可以进行检查。Python文档仅仅状态None表示该过程仍在运行(负值也是可能的;见文档的详细信息)。

除此之外,如果出于某种原因需要终止仍在运行的子进程,则必须使用以下方法设置并捕获超时:

   try:
      # time out in five seconds
      n.wait(timeout=5)
   except TimeOutExpired:
      # you can use kill, terminate or send_signal method; see the docs
      n.kill()

...,或者完全不使用wait:而是让子进程在您执行代码中的其他操作时运行,然后在以后将其杀死:

   import os

   processes = []
   for package in server.packages:
      n = subprocess.Popen(['which', package], stdout=subprocess.DEVNULL)
      processes.append(n)

   <some other code while the subprocesses run (and possibly terminate)>

   for p in processes:
      try:
          p.kill()
      except OSError:
          # silently fail if the subprocess has exited already
          pass

如果您只想检查过程是否还存在怎么办?不幸的是,Python stdlib没有一种检查进程是否正在运行的好方法。但是,可以使用第三方库psutil方便地完成此操作有了它,检查一个过程是否存在就很容易:

   pid = n.pid # where n is a subprocess.Popen object from above examples
   import psutil
   psutil.pid_exists(pid) # returns True or False

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在 asyncio 子进程上调用 .terminate() 会引发 ProcessLookupError

来自分类Dev

为什么Linux会杀死我的进程?

来自分类Dev

为什么优化会杀死该功能?

来自分类Dev

为什么我会“进程被杀死”?

来自分类Dev

当在OS X上杀死Python进程时,为什么不杀死子进程呢?

来自分类Dev

为什么进程被nohup杀死

来自分类Dev

如果exec.Start()创建的进程的父进程被SIGINT杀死,为什么会退出呢?

来自分类Linux

为什么父进程在Linux中被杀死后,子进程仍然存在?

来自分类Dev

从Docker容器内部杀死子进程会杀死整个容器

来自分类Dev

为什么FakeItEasy会引发此异常,以及为什么使该方法虚拟修复呢?

来自分类Dev

为什么当终端被杀死时我执行的进程会死亡

来自分类Dev

当几乎不使用交换时,为什么OOM杀手会杀死进程?

来自分类Dev

为什么控制台中的Ctrl + C会杀死后台进程

来自分类Linux

为什么kill -2无法杀死进程?

来自分类Dev

为什么nohup后台进程被杀死?

来自分类Dev

为什么我杀死openarena进程失败?

来自分类Dev

为什么会引发AutomaticMigrationsDisabledException?

来自分类Linux

如果使用了waitFor,为什么杀死JVM还会终止其子进程?

来自分类Dev

为什么要在等待后检查WIFEXITED以杀死Linux系统调用中的子进程?

来自分类Dev

通过其子进程分析进程,然后杀死该子进程

来自分类Dev

通过信号杀死子进程,但是位置会影响吗?

来自分类Dev

DotnetCore-为什么该应用程序工具会引发“ System.Resources.Extensions”异常?

来自分类Dev

我可以看到 /bin/bash 文件夹,但为什么该命令会引发错误

来自分类Dev

杀死NodeJS子进程

来自分类Dev

如何杀死子进程

来自分类Dev

什么是<defunct>进程,为什么它不被杀死?

来自分类Linux

当父级被杀死时,用fork()创建的子进程会自动被杀死吗?

来自分类Dev

为什么找不到子字符串时Python会引发错误?

来自分类Java

为什么这段代码会引发NullPointerException?

Related 相关文章

  1. 1

    在 asyncio 子进程上调用 .terminate() 会引发 ProcessLookupError

  2. 2

    为什么Linux会杀死我的进程?

  3. 3

    为什么优化会杀死该功能?

  4. 4

    为什么我会“进程被杀死”?

  5. 5

    当在OS X上杀死Python进程时,为什么不杀死子进程呢?

  6. 6

    为什么进程被nohup杀死

  7. 7

    如果exec.Start()创建的进程的父进程被SIGINT杀死,为什么会退出呢?

  8. 8

    为什么父进程在Linux中被杀死后,子进程仍然存在?

  9. 9

    从Docker容器内部杀死子进程会杀死整个容器

  10. 10

    为什么FakeItEasy会引发此异常,以及为什么使该方法虚拟修复呢?

  11. 11

    为什么当终端被杀死时我执行的进程会死亡

  12. 12

    当几乎不使用交换时,为什么OOM杀手会杀死进程?

  13. 13

    为什么控制台中的Ctrl + C会杀死后台进程

  14. 14

    为什么kill -2无法杀死进程?

  15. 15

    为什么nohup后台进程被杀死?

  16. 16

    为什么我杀死openarena进程失败?

  17. 17

    为什么会引发AutomaticMigrationsDisabledException?

  18. 18

    如果使用了waitFor,为什么杀死JVM还会终止其子进程?

  19. 19

    为什么要在等待后检查WIFEXITED以杀死Linux系统调用中的子进程?

  20. 20

    通过其子进程分析进程,然后杀死该子进程

  21. 21

    通过信号杀死子进程,但是位置会影响吗?

  22. 22

    DotnetCore-为什么该应用程序工具会引发“ System.Resources.Extensions”异常?

  23. 23

    我可以看到 /bin/bash 文件夹,但为什么该命令会引发错误

  24. 24

    杀死NodeJS子进程

  25. 25

    如何杀死子进程

  26. 26

    什么是<defunct>进程,为什么它不被杀死?

  27. 27

    当父级被杀死时,用fork()创建的子进程会自动被杀死吗?

  28. 28

    为什么找不到子字符串时Python会引发错误?

  29. 29

    为什么这段代码会引发NullPointerException?

热门标签

归档