为什么subprocess.Popen使用旧版本的vim?

时间:2013-03-12 15:13:21

标签: python vim

当我运行vi --version时,我看到VIM - Vi IMproved 7.3但是当我运行以下脚本时,它会打印出我的版本7.2。为什么呢?

pathnameviwhich vi打印/usr/local/bin/vim--version7.3which gvim打印/usr/bin/gvim--version也会打印较新版本的vim。

echo $EDITOR打印vi

#!/usr/bin/python
import os
import sys
import os.path
import subprocess
import tempfile


def exec_vimcmd(commands, pathname='', error_stream=None):
"""Run a list of Vim 'commands' and return the commands output."""
try:
    perror = error_stream.write
except AttributeError:
    perror = sys.stderr.write

if not pathname:
    pathname = os.environ.get('EDITOR', 'gvim')

args = [pathname, '-u', 'NONE', '-esX', '-c', 'set cpo&vim']
fd, tmpname = tempfile.mkstemp(prefix='runvimcmd', suffix='.clewn')
commands.insert(0,  'redir! >%s' % tmpname)
commands.append('quit')
for cmd in commands:
    args.extend(['-c', cmd])

output = f = None
try:
    try:
        print "args are"
        print args
        subprocess.Popen(args).wait()
        f = os.fdopen(fd)
        output = f.read()
        print "output is"
        print output
        print "that's the end of the output"
    except (OSError, IOError), err:
        if isinstance(err, OSError) and err.errno == errno.ENOENT:
            perror("Failed to run '%s' as Vim.\n" % args[0])
            perror("Please set the EDITOR environment variable or run "
                            "'pyclewn --editor=/path/to/(g)vim'.\n\n")
        else:
            perror("Failed to run Vim as:\n'%s'\n\n" % str(args))
            perror("Error; %s\n", err)
        raise
finally:
    if f is not None:
        f.close()

exec_vimcmd(['version'])

打印的参数是

['vi', '-u', 'NONE', '-esX', '-c', 'set cpo&vim', '-c', 'redir! >/var/folders/86/062qtcyx2rxbnmn8mtpkyghs0r0r_z/T/runvimcmducLQCe.clewn', '-c', 'version', '-c', 'quit']

1 个答案:

答案 0 :(得分:1)

找出分配给pathname的值,并查看它是否与在命令提示符下输入的which vimwhich gvim一致。您的脚本正在查看您的$EDITOR环境变量,但是当您从命令行运行(g)vim时,它会搜索您的$PATH以查找第一个匹配项。例如,您可能正在从CLI运行/opt/local/bin/vim,但从脚本运行/usr/bin/vim