跳到内容

subprocess-popen-preexec-fn (PLW1509)

源自 Pylint 代码检查工具。

作用

检查 subprocess.Popen 的使用,如果使用了 preexec_fn 参数。

为什么这不好?

preexec_fn 参数在线程中是不安全的,因为它可能导致死锁。此外,preexec_fn 已被计划弃用

作为替代方案,请考虑使用特定于任务的参数,例如 envstart_new_sessionprocess_group。这些不易发生死锁,并且更加明确。

示例

import os, subprocess

subprocess.Popen(foo, preexec_fn=os.setsid)
subprocess.Popen(bar, preexec_fn=os.setpgid(0, 0))

建议改为

import subprocess

subprocess.Popen(foo, start_new_session=True)
subprocess.Popen(bar, process_group=0)  # Introduced in Python 3.11

参考