用子流程关闭图像

我试图用子流程打开一个图像,以便用户可见,然后关闭图像使其消失。

这个问题之前已经被问过了,但是我发现的答案并没有为我工作。 以下是我所检查的内容:

杀死用Python的subprocess.Popen()创建的进程

如何终止用shell = True启动的python子进程

如何使用Python Imaging Library关闭向用户显示的图像?

我需要代码来打开一个图像(预览(可选),我的Mac上是默认的),等待一秒钟,然后关闭图像。

openimg = subprocess.Popen(["open", mypath])
time.sleep(1)
openimg.terminate()
openimg.kill()

一切都告诉我要终止()和杀死(),但仍然没有关闭图像。

这不必使用预览,我也愿意接受其他选项。

编辑:我另外尝试了下面的代码,仍然没有成功

print('openimg's pid = ',openimg.pid)
os.kill(openimg.pid, signal.SIGKILL)

OS X的open命令是异步的 - 它产生了一个预览过程(或者它启动的任何应用程序)并立即退出。 所以当你的Python代码开始调用terminate()kill()open过程就完成了。 它不再存在。

您可以强制执行同步行为,即在“预览”退出后,通过传递-W选项使open继续运行,

subprocess.Popen(["open", "-W", mypath])

这样,当代码开始运行terminatekill时, open仍然会运行。 (我会建议同时传递-n选项以确保预览启动一个新实例,以防您有另一个预览实例坐在前面)。当open过程结束时,希望它也会结束底层的预览过程。 您可以使用进程查看器(如pspgrep来检查是否真的发生了这种情况。

如果终止或终止open并不会终止预览,则需要更改配置,以便在调用terminate()kill()时将信号发送到所有open子进程,对于这个问题或此问题可能是有用的,或者你必须找到一种方法来获得预览的进程ID并直接发送信号,这将要求你超越Popen 。 我不确定这样做的最佳方法,但也许别人可以提供一个答案,告诉你如何做到这一点。


我敢肯定这是做这件事的最快捷的方式,但是它会起作用。 如果有人绊倒在这,并知道更好的方式,请让我知道。

大卫Z所描述的问题 ,我并没有针对正确的过程。 所以我必须弄清楚正确的进程ID是为了正确关闭它。

我开始打开我的终端并输入命令ps -A 。 这将显示所有当前打开的进程及其ID。 然后,我刚刚搜索了Preview并找到两个打开的进程。

以前,我正在关闭列表中的第一个Preview pid,我们称之为11329但列表中的第二个仍然打开。 第二个预览过程11330总是比第一个过程高出1位数。 第二个是我需要关闭预览的pid。

答案

openimg = subprocess.Popen(["open", mypath]) ##Opens the image to view
newpid = openimg.pid + 1 ##Gets the pid 1 digit higher than the openimg pid. 
os.kill(newpid, signal.SIGKILL) ##Kills the pid and closes Preview

这个答案看起来很脆弱,但对我来说很有用。 我只是刚开始学习pid,所以如果有人能提供一些知识,我会很感激。

链接地址: http://www.djcxy.com/p/66493.html

上一篇: Close Image with subprocess

下一篇: Do NOT terminate python subprocess when script ends