我正在开发一个python脚本,它会启动MacVim编辑器来编辑一个或多个文本文件,并在文件打开时进行一些并行处理。我需要检查文件是否仍然打开或已经关闭以便停止处理。此外,还需要跟踪每个文件,因为文件可以独立打开和关闭。
我正在为每个文件创建线程。显然,我不希望我的脚本打开几个MacVim实例,所以我实现了一个Vim服务器,以便在一个窗口中打开标签。
from threading import Thread
class CtrlThread (Thread):
def __init__(self, editfile):
Thread.__init__(self)
self.editfile = editfile
def run (self):
subprocess.call(["/usr/bin/mvim", "-g", "--remote-tab-silent",self.editfile])
稍后我创建了帖子:
tr = CtrlThread(editfile)
tr.start()
我遇到了一个奇怪的MacVim行为。
启动它至少有两种不同的方法。一个是通过/usr/bin/mvim
,另一个是使用路径/Applications/MacVim.app/Contents/MacOS/MacVim
。当我使用第一个路径时,MacVim在服务器上的行为正确(没有额外的窗口,没有多个实例),但subprocess.call
没有等待文件关闭。相反,它立即跳出run()。
使用第二个路径,call
方法等待文件关闭,然后很好地退出run()。缺点是它完全搞砸了vim服务器(无用的窗口,MacVim的多个实例)。
我尝试在使用--remote ...
向其发送新文件之前打开vim服务器(MacVim --servername SERVER),但这并没有改变任何内容。
所以我试图跟踪进程的pid,但是call
和Popen
都没有给我正确的文件pid,而是返回一个更高的Vim实例的pid:
def run (self):
p = subprocess.Popen(["/usr/bin/mvim", "-g", "--remote-tab-silent" ,self.editfile])
print("Pid: ", p.pid)
输出:
Pid: 1699
Shell输出(ps aux):
USER PID ... COMMAND
user 1699 ... (Vim)
user 1702 ... /Applications/MacVim.app/Contents/MacOS/Vim -f -g -g --remote-tab-silent /path/to/file
如果我找不到跟踪pid的另一种方式,我会在任何情况下都需要第二个pid,但我找不到抓住它的方法。