我正在尝试使用 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"'''])
但是我想要一个跨平台的解决方案。
您可以求助于 lsof ...,下面是一个简单的示例...,然后使用逻辑来确定给定条目是否匹配条件(用户名、文件名等)....
请参阅 lsof 文档了解复杂情况。
lsof -FuncL n/Users/ticktalk/Downloads/w_aaaa1364.pdf
p87598
cPreview
u501
Lticktalk
ftxt
n/Users/ticktalk/Downloads/w_aaaa1364.pdf