Python调用subprocess的terminate方法提示缺少self参数如何解决
问题根因
你的报错核心是列表中存在未被替换的subprocess.Popen类本身,而非类的实例:
- 你初始化列表时写的
processInstances = [subprocess.Popen] * 5,是把subprocess.Popen这个类重复5次存入列表,而非创建5个Popen实例。 - 类的实例方法需要绑定实例后调用,如果你直接用类本身调用
terminate(),就会要求你手动传入self参数,也就触发了你遇到的类型错误。 - 通常触发该报错有两个场景:
- 你没有先调用
startMultipleProcess()完成所有进程实例的创建,就直接调用了stopMultipleProcess() startMultipleProcess()执行过程中某一步创建Popen实例失败抛出异常,导致列表中还有部分元素是subprocess.Popen类本身
- 你没有先调用
修复方案
建议修改初始化逻辑和终止逻辑,增加实例有效性判断,参考修正后的代码:
import subprocess # 初始化用None占位,避免直接存类 processInstances = [None] * 5 myprocess = "你的可执行程序路径" # 补充你自己的进程路径 class ProcessManager: def startMultipleProcess(self): global processInstances for i in range(5): processInstances[i] = subprocess.Popen([myprocess], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) def stopMultipleProcess(self): global processInstances for instance in processInstances: # 先判断是有效实例再调用终止方法 if instance and isinstance(instance, subprocess.Popen): instance.terminate() # 可选:等待进程退出,避免僵尸进程 instance.wait()
如果你不需要固定长度的列表,也可以初始化用空列表,创建进程时用append()方法添加实例,终止时直接遍历即可,不用判断空占位。
内容的提问来源于stack exchange,提问作者GMX
相关产品推荐
相关产品推荐

