Как заставить старые версии eog работать в новом экземпляре? - PullRequest
2 голосов
/ 19 сентября 2011

У меня есть небольшой скрипт на python, в котором я отображаю изображения, записывая их во временный файл, вызывая eog для временного файла, а затем вызывая rm для временного файла после закрытия процесса eog. Соответствующий код выглядит в основном так:

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 таким образом, чтобы он не обнаруживал, есть ли другие экземпляры? Или есть другая надежная стратегия для отображения изображений в сложной программе просмотра (т. Е. Поддерживает масштабирование, панорамирование и т. Д.), Которая не загромождает мой каталог временными файлами?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2011

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 убедитесь, что сценарий продолжает работать после выхода из системы.

0 голосов
/ 19 сентября 2011

В целом может быть лучший способ сделать это, но если вы хотите убедиться, что rm не запускается до завершения eog, вы можете использовать wait() для объекта Popen.Это решит ваши проблемы сбоев, но вам также нужно будет проверить, работает ли существующий процесс eog.

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, прежде чем удаляет временное изображение.

...