2011-09-18 3 views
2

나는 임시 파일에 그들을 쓰고, 임시 파일에 eog를 호출 한 다음 이미지가 닫힌 후 임시 파일에 rm을 호출하여 이미지를 표시하는 작은 파이썬 스크립트를 가지고있다. 관련 코드는 기본적으로 다음과 같습니다.이전 버전의 eog를 강제로 새 인스턴스에서 실행하는 방법?

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

--new-instance 플래그는 중요합니다. 그것없이, 이미 eog 프로세스가 있다면, eog 호출은 기존의 eog 프로세스에 tmp.jpg를 표시하고 즉시 리턴한다고 알려줍니다. rm은 선재 프로세스가 tmp.jpg를 열 수 있기 전에 실행됩니다. 선재 프로세스가 충돌합니다.

불행히도이 스크립트를 사용하는 일부 시스템을 완벽하게 제어 할 수는 없습니다. 그들 중 일부는 --new-instance를 지원하지 않는 오래된 버전의 eog가 설치되어 있으며 로컬 복사본을 작성하기 위해 할당량 공간을 소진하고 싶지 않습니다.

다른 인스턴스가 있는지 감지하지 못하도록 어록을 시작할 수있는 방법이 있습니까? 또는 정교한 뷰어 (즉, 확대/축소, 패닝 등을 지원하는)에서 이미지를 표시하는 또 다른 신뢰할 수있는 전략이 내 디렉터리를 임시 파일로 복잡하게 만들지는 않습니까?

답변

0

가이 전체를 할 수있는 더 좋은 방법이 될 수도 있지만, 당신이 확인하고 싶은 경우 완료 eog, 당신이 Popen 객체에 wait()를 사용하기 전에 rm 실행되지 않습니다. 이렇게하면 문제가 해결되지만 기존 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이 완료 될 때까지 기다렸다가 임시 이미지를 제거합니다.

0

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 확실히 있는지 확인 스크립트는 로그 아웃 한 후에도 계속 작동합니다.

관련 문제