You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中使用subprocess打开PDF后无法通过kill()关闭的问题求助

解决subprocess.Popen启动PDF后kill()无法关闭阅读器的问题

嘿,这个坑我之前踩过!问题出在你使用了shell=True参数——这时候subprocess.Popen创建的并不是PDF阅读器进程,而是一个shell父进程,PDF阅读器是它的子进程。当你调用openpdffile.kill()时,只终止了shell父进程,子进程(阅读器)会被系统接管,继续在后台运行,自然关不掉。

下面给你几个可行的解决办法,按推荐程度排序:

方法1:直接启动PDF阅读器进程(最推荐)

去掉shell=True,直接调用PDF阅读器的可执行文件并传入PDF路径。这样Popen直接创建阅读器进程,kill()就能直接终止它。

根据你的操作系统,代码示例如下:

import subprocess

# Linux(以Evince为例,根据你的阅读器替换)
openpdffile = subprocess.Popen(["evince", file_path])

# macOS(用Preview打开)
# openpdffile = subprocess.Popen(["open", "-a", "Preview", file_path])

# Windows(以Adobe Acrobat DC为例,替换成你的阅读器路径)
# openpdffile = subprocess.Popen(["C:/Program Files/Adobe/Acrobat DC/Acrobat/Acrobat.exe", file_path])

# 现在调用kill()就能正常关闭阅读器了
openpdffile.kill()

方法2:用psutil库终止进程树

如果因为某些原因必须使用shell=True,可以借助psutil库找到shell进程的所有子进程(也就是PDF阅读器),然后一起终止。

首先安装psutil:

pip install psutil

然后编写代码:

import subprocess
import psutil

openpdffile = subprocess.Popen([file_path], shell=True)

# 获取shell进程的所有子进程
parent_process = psutil.Process(openpdffile.pid)
child_processes = parent_process.children(recursive=True)

# 先终止所有子进程,再终止父shell进程
for child in child_processes:
    child.kill()
openpdffile.kill()

方法3:Windows系统用taskkill命令终止进程树

在Windows上,你也可以直接调用系统的taskkill命令,通过/T参数终止整个进程树(包括子进程):

import subprocess

openpdffile = subprocess.Popen([file_path], shell=True)

# /F 强制终止,/T 终止进程树
subprocess.run(["taskkill", "/F", "/T", "/PID", str(openpdffile.pid)])

内容的提问来源于stack exchange,提问作者Rolf12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 19:47:29