[英]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.