簡體   English   中英

檢查打開的文本文件

[英]Check for open text file

我正在編寫一個Python應用程序,它在不同的線程中打開了幾個文本文件。 我希望每個線程在打開文件時對文件進行一些操作。 當外部文本編輯器關閉文件時,相應線程的處理應停止。 因此,我需要檢查文本文件是否仍處於打開狀態。

class MyThread (Thread):

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

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

現在的問題是,子進程會在編輯器中打開文件,然后run()終止。 如何在外部關閉文件之前保持run()打開?

您是否嘗試過subprocess.call方法?

subprocess.call('notepad')

這將等待命令完成,然后進程終止並將控制權返回給程序。

這是我寫的:

從線程導入子進程import Thread

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()

程序一直打印“ Still Alive”,直到我關閉記事本窗口。

您有兩個事件:FileOpen和FileClose。 打開編輯器時會發生FileOpen。 當編輯器關閉時FileClose完成嗎? 還是當編輯器關閉文件時? 如果只是關閉編輯器,那么應​​該很容易找出子進程何時關閉,然后終止工作線程。

除非編輯器提供了特定的API,否則要確定它是否關閉了文件但編輯器仍處於打開狀態,這將是一個非常討厭的黑客。 例如,您可能必須輪詢lsof並處理輸出。

這聽起來與修訂控制系統在提交文件時所執行的操作類似,並且會為您打開編輯器。 也許您應該檢查hg或bzr代碼庫。 是Mercurial處理它的方式。 是集市如何處理的。

我更改了Shekar的版本以與vim一起使用,並將該列表用作subprocess.call命令中的命令(並添加了import)。 如他所描述的那樣工作。

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()  

我發現了問題。 我正在通過命令行使用/ usr / bin / mvim調用編輯器MacVim。 現在,我將其更改為/Applications/MacVim.app/Contents/MacOS/MacVim,它可以按預期工作。 我認為這是因為它檢查直接處理的唯一進程,在第一種情況下,它是終端而不是編輯器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM