首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在新实例中强制运行旧版本的eog?

如何在新实例中强制运行旧版本的eog?
EN

Stack Overflow用户
提问于 2011-09-19 06:21:48
回答 2查看 505关注 0票数 2

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

代码语言:javascript
复制
os.popen('(eog --new-instance tmp.jpg; rm tmp.jpg)&')

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

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

有没有什么方法可以启动eog,防止它检测到是否有其他实例?或者,是否有其他可靠的策略可以在复杂的查看器中显示图像(例如,支持缩放、平移等)这不会弄乱我的目录中的临时文件?

EN

回答 2

Stack Overflow用户

发布于 2011-09-19 06:28:18

可能有一种更好的方法来实现这一点,但是如果您希望确保rmeog完成之前不会运行,您可以在Popen对象上使用wait()。这将解决您的崩溃问题,但是您还需要检查现有的eog进程是否正在运行。

代码语言:javascript
复制
import subprocess as subp
import os, signal
findInstance = subp.check_output('ps -eaf | grep eog', shell=True).strip()
for line in findInstance.decode('utf-8').split('\n'):
    if line.split()[7] == 'eog':
        os.kill(int(line.split()[1]), signal.SIGKILL)
subp.Popen(['eog','tmp.jpg']).wait()
subp.Popen(['rm','tmp.jpg'])

这将查找eog进程,如果找到它,就终止它。然后,它重新唤醒可以显示新图像的eog,并等待eog完成,然后删除临时图像。

票数 0
EN

Stack Overflow用户

发布于 2011-09-19 15:08:36

eog监控文件的名称,所以你不能只是打开一个图像,然后安全地解除它的链接。

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

代码语言:javascript
复制
#!/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()

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

代码语言:javascript
复制
$ python your_script.py & disown

disown请确保该脚本在您注销后继续工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7464852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档