繁体   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