如何终止Python子进程打开的应用程序

问题描述 投票:0回答:1

我正在尝试使用 macos 上的默认应用程序打开 pdf 文件,即

preview
,以及

import subprocess
doc = subprocess.Popen(['open', 'path_to_doc.pdf'])

然后关闭它。

我已经尝试过如何终止使用 shell=True 启动的 python 子进程中的解决方案,但它们都不起作用。

process = psutil.Process(doc.pid)

结果

psutil.Process(pid=6994, name='open', status='zombie', started='12:07:11')
process.children(recursive=True)
是空的。

os.getpgid(doc.pid)
结果为
ProcessLookupError: [Error 3]No such process
。通过检查活动监视器(查看进程的应用程序),我发现应用程序的
pid
始终是
doc.pid+1
。如果是
doc.pid == 6994
,则应用程序的
pid
6995
。我可以使用
os.killpg(doc.pid+1, signal.SIGTERM)
关闭应用程序,但这似乎很主观,可能并不总是有效。

我知道 macOS 上的

osascript
可以关闭应用程序,例如使用代码

clo = subprocess.Popen(['osascript', '-e', '''quit app "preview"'''])

但是我想要一个跨平台的解决方案。

python linux macos subprocess kill-process
1个回答
0
投票

您可以求助于 lsof ...,下面是一个简单的示例...,然后使用逻辑来确定给定条目是否匹配条件(用户名、文件名等)....

请参阅 lsof 文档了解复杂情况。

lsof -FuncL n/Users/ticktalk/Downloads/w_aaaa1364.pdf
p87598
cPreview
u501
Lticktalk
ftxt
n/Users/ticktalk/Downloads/w_aaaa1364.pdf
© www.soinside.com 2019 - 2024. All rights reserved.