【问题标题】:get pid of process created with subprocess.check_call()获取使用 subprocess.check_call() 创建的进程的 pid
【发布时间】:2021-11-19 11:14:51
【问题描述】:

我目前正在尝试获取以 subprocess.check_call 启动的进程的进程 ID。

from subprocess import check_output

# I want to retrieve the PID of this process:
try:
    p = check_output(['some broken program']) 
except:
    if CalledProcessError: # but Popen does not throw me a CalledProcessError even if program crashes
        print("triage some stuff")
        print(p.pid) # this doesn't work unless its Popen

我尝试过使用 Popen 完美运行,但是,它似乎无法捕获程序终止时,即CalledProcessError

任何人都可以建议,是否有办法解决这两个问题?谢谢!

【问题讨论】:

  • 发布您的代码,以便更清晰
  • 对于除Popen() 之外的所有subprocess 函数,在被调用进程退出之前,您无法取回控制权,因此不再有 pid。

标签: python subprocess


【解决方案1】:
  1. 您也必须导入 CalledProcessError。代码(带 check_output):from subprocess import check_output, CalledProcessError

  2. 要检测特定异常,您必须使用以下语法:

     try:
         statement
     except ExceptionName:
         another_statement
    

    在你的情况下:

     try:
         p = check_output(['some broken program']) 
     except CalledProcessError:
         print("triage some stuff")
    
  3. 您不能在 except 块内引用 p,因为 p 可能未定义。

  4. 此外,如in this post 所述,推荐subprocess.run() 优于subprocess.check_output()

【讨论】:

  • 所以......问题仍然存在。使用 Popen 时有什么方法可以捕获CalledProcessError 异常吗?
猜你喜欢
  • 2014-03-09
  • 2011-02-02
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 2021-08-08
  • 2014-10-10
  • 1970-01-01
  • 2021-08-08
相关资源
最近更新 更多