Python:无法通过子进程获取实际进程ID

时间:2014-04-14 18:34:14

标签: python multithreading vim

我正在开发一个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,但是callPopen都没有给我正确的文件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,但我找不到抓住它的方法。

0 个答案:

没有答案