2014-04-14 3 views
0

파이썬 응용 프로그램을 쓰고 있는데 다른 스레드에서 여러 텍스트 파일을 엽니 다. 열려있는 동안 각 스레드가 파일에 대한 작업을 수행하기를 원합니다. 외부 텍스트 편집기가 파일을 닫으면 해당 스레드의 처리가 중지되어야합니다. 그래서 텍스트 파일이 아직 열려 있는지 여부를 확인해야합니다.열린 텍스트 파일 확인

class MyThread (Thread): 

def __init__(self, sf): 
    Thread.__init__(self) 
    self.sf = sf # sourcefile 

def run (self): 
    subprocess.Popen([EDITOR, self.sf]) 

문제는 이제 하위 프로세스가 편집기에서 파일을 열고 run()이 종료된다는 것입니다. 어떻게 외부에서 파일을 닫을 때까지 run()을 열어 둘 수 있습니까?

+0

파이썬 코드가 파일을 읽거나 쓰는 중이라면 동시에 외부 편집기를 열 필요가 있습니까? – merlin2011

+0

파이썬 코드는 텍스트 파일의 내용으로 아무 것도하지 않습니다. 아이디어는 텍스트 편집기 (vi)의 기능을 사용하고 있습니다. 발생하는 처리는 내용을 html로 변환하여 다른 파일에 저장하는 것입니다. – loxosceles

+0

텍스트 편집기는 읽기 및 쓰기 작업 중에 만 짧은 시간 동안 파일을 엽니 다. 그 시간 동안 파일을 잠그거나 "스왑"파일 등을 만들거나하지 않을 수도 있습니다. 더 나은 접근법은 폴링 수정 시간 또는'inotify'와 같은 것을 사용하여 파일이 언제 변경되는지를 찾는 것입니다. 행운을 빕니다. –

답변

0

subprocess.call 메서드를 사용해 보셨습니까?

subprocess.call('notepad') 

프로세스가 종료되기 전에 명령이 완료 될 때까지 기다렸다가 컨트롤을 다시 프로그램에 반환합니다.

수입 서브 프로세스 을 수입 스레드에게

class MyThread(Thread): 

    def __init__(self, sf): 
     Thread.__init__(self) 
     self.sf = sf 

    def run(self): 

     subprocess.call('notepad ' + self.sf) 


def main(): 
    myThread = MyThread('test.txt') 
    myThread.start() 
    while myThread.isAlive(): 
     print "Still Alive" 


if __name__ == '__main__': 
    main() 

프로그램을 스레딩에서 인쇄를 계속 "살아"나는 메모장 창을 닫을 때까지 :

이 내가 쓴 것입니다.

+0

예, 이전에 시도했지만 작동하지 않았습니다. 모든 스레드를 시작한 후에 목록에 추가합니다. 그런 다음 thread.isAlive()를 사용하여 목록을 반복하면 즉시 멈출 수 있습니다. – loxosceles

+0

이상합니다.자기 (DEF 실행 김포 스레드 .__의 init __ (자기) self.sf = 데프 __init __ (자기, SF) : 이것은 내가 클래스 MyThread (스레드)를 수입 스레드 스레딩에서 수입 하위 프로세스 을 쓴 것입니다) subprocess.call ('메모장'+ self.sf) DEF의 main() myThread MyThread = ('TEST.TXT') myThread.start() 동안 myThread.isAlive() "Still Alive"인쇄하기 if __name__ == '__main__': main(). 그것은 메모장 창을 닫을 때까지 "Still Alive"인쇄를 계속합니다. – Shekhar

+0

파일을 완전히로드했을 때 텍스트 편집기가 시작될 때 코드를 시도하고 "Still Alive"를 출력합니다. – loxosceles

0

두 개의 이벤트 FileOpen 및 FileClose가 있습니다. 편집기를 열면 FileOpen이 발생합니다. 편집자가 닫히면 FileClose가 완료됩니까? 또는 편집기가 파일을 닫을 때? 편집기를 닫는 중일 때 하위 프로세스가 닫힌 시간을 확인한 다음 작업자 스레드를 종료하는 것이 간단해야합니다.

편집기가 특정 API를 제공하지 않는 한, 파일을 닫았지만 편집기가 열린 상태인지 확인하는 것은 정말 불쾌한 해킹이 될 것입니다. 예 : lsof를 폴링하고 출력을 처리해야 할 수도 있습니다.

파일을 커밋하고 편집기를 열 때 개정 제어 시스템과 비슷한 소리가납니다. 어쩌면 당신은 hg 또는 bzr 코드베이스를 확인해야합니다. Here은 수은이 그것을 처리하는 방법입니다. 그리고 here은 bazaar가 어떻게 처리 하는지를 보여줍니다.

나는 shekar의 버전을 vim에서 작동하도록 변경했으며이 목록을 subprocess.call 명령의 명령으로 사용하고 가져 오기를 추가했습니다. 그가 설명하는대로 작동합니다.

from threading import Thread              
import subprocess                
class MyThread(Thread):               
    def __init__(self, sf):              
     Thread.__init__(self)             
     self.sf = sf                
    def run(self):                
     subprocess.call(['/usr/bin/vim', self.sf])        

def main():                  
    myThread = MyThread('test.txt')            
    myThread.start()                
    while myThread.isAlive():             
     print "Still Alive"              

if __name__ == '__main__':              
    main() 
0

이 문제점을 발견했습니다./usr/bin/mvim 명령 줄을 통해 편집자 MacVim을 호출했습니다. 이제 그것을 /Applications/MacVim.app/Contents/MacOS/MacVim으로 변경했으며 예상대로 작동합니다. 나는 직접 처리하는 유일한 프로세스를 검사하기 때문에 그것이라고 생각합니다. 첫 번째 경우는 터미널이 아니라 편집기였습니다.