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