用子流程关闭图像
我试图用子流程打开一个图像,以便用户可见,然后关闭图像使其消失。
这个问题之前已经被问过了,但是我发现的答案并没有为我工作。 以下是我所检查的内容:
杀死用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])
这样,当代码开始运行terminate
和kill
时, open
仍然会运行。 (我会建议同时传递-n
选项以确保预览启动一个新实例,以防您有另一个预览实例坐在前面)。当open
过程结束时,希望它也会结束底层的预览过程。 您可以使用进程查看器(如ps
或pgrep
来检查是否真的发生了这种情况。
如果终止或终止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