在macOS上使用terminate()调用时,打开的程序不会关闭。
我试图通过python打开一个外部文件,然后关闭它。除了在macOS上杀死进程(应用程序)之外,一切似乎都在工作。怎么杀了?
prog = subprocess.Popen(['open', FileName])
while True:
if keyboard.is_pressed("q"):
prog.terminate()
break
不那么容易。
在mac中,open
命令将挖掘系统以找到启动文件的应用程序,这意味着它将fork-exec另一个可执行文件作为新进程。完成后,open
命令将终止,同时保持其他进程运行(在后台,作为孤立进程)。
因此,使用subprocess
上下文,您将看到open
的进程ID,但不会看到open
启动的子进程的进程ID。此外,考虑open
启动目录的情况,在Mac上它将作为Finder上的新窗口打开。然后,您没有创建新的进程ID!类似地,对于其他文件,如果在调用open
之前调用的应用程序已经运行,并且它更喜欢在现有进程的新选项卡中打开新文件。
在您的情况下,如果您想要更好的控制,可能您需要找出正确的应用程序来打开您的文件,并直接启动它而不是依赖open
。
编辑:
这是开放的man page。您可以使用某些开关进行开放运行,直到子进程终止,依此类推。但是,我仍然不确定你是否可以通过杀死开放来杀死子进程(无论成功与否取决于很多因素)。您可能需要弄清楚子进程的进程ID并直接终止它们。