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
相关产品推荐
相关产品推荐

