我有一个小python脚本,在其中显示图像,方法是将图像写入临时文件,在临时文件上调用eog,然后在eog进程关闭后在临时文件上调用rm。相关代码基本上如下所示:

os.popen('(eog --new-instance tmp.jpg; rm tmp.jpg)&')


--new-instance标志很重要;否则,如果已经有一个eog进程,则eog调用只是告诉预先存在的eog进程显示tmp.jpg并立即返回。 rm将在预先存在的eog进程打开tmp.jpg之前执行。然后,先前存在的eog进程崩溃。

不幸的是,我无法完全控制使用此脚本的某些系统。其中一些安装了不支持--new-instance的过时版本的eog,我不想消耗我的配额空间来构建本地副本。

有什么方法可以启动eog来阻止它检测是否还有其他实例吗?还是有另一种可靠的策略,可以在复杂的查看器中显示图像(即,支持缩放,平移等),而不会使我的目录中出现临时文件?

最佳答案

eog按名称监视文件,因此您不能只打开图像然后安全地取消链接。

您可以在删除文件之前引入延迟:

#!/usr/bin/env python
import os
import subprocess
import tempfile
import time

from threading import Thread

def write_image_to(f):
    f.write(open(os.path.expanduser('~/Pictures/lenaNN.jpg'), 'rb').read())

def f(write_image_to, delay=None):
    with tempfile.NamedTemporaryFile() as fileobj:
        write_image_to(fileobj)
        fileobj.flush() # ensure writing to disk

        r = subprocess.call(['eog','--new-instance',fileobj.name],close_fds=True)
        if r: # eog don't support new-instance
           subprocess.call(['eog', fileobj.name], close_fds=True)
           if delay:
              time.sleep(delay)

for _ in xrange(10):
    Thread(target=f, args=(write_image_to, 3600)).start()


为了避免等待延迟到期,您可以在后台调用脚本:

$ python your_script.py & disown


disown确保注销后脚本继续运行。

08-25 21:18