使用特定版本的Python编译vim

26

我正在处理多个Python项目,这些项目运行在不同的Python版本上。我希望设置我的vim环境来使用ropevim、pyflakes和pylint,但是由于使用了一个单独为特定Python版本编译的vim,而与项目的Python版本不匹配,所以遇到了一些问题。

我希望将vim构建到每个虚拟环境目录中,但是我遇到了一个问题,无法使其正常工作。尽管在虚拟环境中指定了Python配置文件夹,但始终会使用系统级的Python解释器。

目前,我已经安装了Python 2.6.2和Python 2.7.1,并从每个版本创建了多个虚拟环境。我正在使用Ubuntu 10.04,系统默认Python版本为2.6.5。每次编译vim并调用:python import sys; print(sys.version)时,它都返回Python 2.6.5

configure --prefix=/virtualenv/project --enable-pythoninterp=yes --with-python-config-dir=/virtualenv/project/lib/python2.6/config

在config.log中产生以下结果:

...
configure:5151: checking --enable-pythoninterp argument
configure:5160: result: yes
configure:5165: checking for python
configure:5195: result: /usr/bin/python
...

应该是 /virtualenv/project/bin/python。有没有办法指定vim要使用的Python解释器?

注意:我可以确认在PATH环境变量的最前面出现了/virtualenv/project/bin。

5个回答

13
我建议使用两个解释器构建vim,然后使用我提供的shell脚本来指定特定的虚拟环境并调用它。我能够使用以下命令构建针对Python 2.7的vim(2.7已安装在$HOME/root下):
% LD_LIBRARY_PATH=$HOME/root/lib PATH=$HOME/root/bin:$PATH \
    ./configure --enable-pythoninterp \ 
    --with-python-config-dir=$HOME/root/lib/python2.7/config \
    --prefix=$HOME/vim27
% make install
% $HOME/bin/vim27

:python import sys; print sys.path[:2]
['/home/pat/root/lib/python27.zip', '/home/pat/root/lib/python2.7']

你的虚拟环境实际上只是一个围绕着创建它的Python解释器的薄层包装器--$HOME/foobar/lib/python2.6/config是指向/usr/lib/python2.6/config的符号链接。

因此,如果你使用系统解释器创建虚拟环境,VIM将探测它,并最终链接到真正的解释器,默认情况下使用系统的sys.path,即使configure会显示虚拟环境的路径:

% PATH=$HOME/foobar/bin:$PATH ./configure --enable-pythoninterp \
    --with-python-config-dir=$HOME/foobar/lib/python2.6/config \
    --prefix=$HOME/foobar
..
checking for python... /home/pat/foobar/bin/python
checking Python's configuration directory... (cached) /home/pat/foobar/lib/python2.6/config
..

% make install
% $HOME/foobar/bin/vim
:python import sys; print sys.path[:1]
['/usr/lib/python2.6']
解决方法:由于您的系统vim很可能是针对您的系统python编译的,因此您不需要为每个虚拟环境重新构建vim:您只需在虚拟环境的bin目录中放置名为vim的shell脚本,在调用系统vim之前扩展PYTHONPATH:

~/HOME/foobar/bin/vim文件内容:

#!/bin/sh
ROOT=`cd \`dirname $0\`; cd ..; pwd`
PYTHONPATH=$ROOT/lib/python2.6/site-packages /usr/bin/vim $*

当该函数被调用时,虚拟环境的sys.path会被插入:

% $HOME/foobar/bin/vim
:python import sys; print sys.path[:2]
['/home/pat/foobar/lib/python2.6/site-packages', '/usr/lib/python2.6']

我提到过我使用多个版本的Python,尽管在最初的问题中可能应该再详细说明一下。系统自带的Python并不是我创建虚拟环境所使用的Python。事实上,我有使用Python 2.6.2和Python 2.7.1创建的虚拟环境,但每次编译vim时使用的Python解释器都是/usr/bin/python(在Ubuntu 10.04上为Python 2.6.5)。 - brildum
你的其他Python版本安装在哪里,例如符号链接/virtualenv/project/lib/python2.6/config指向哪里? - samplebias
事实证明,即使我在调用configure时已经激活了虚拟环境(因此当我将“PATH=/virtualenv/project:$PATH ...”添加到命令的开头时,“echo $PATH”会输出“/virtualenv/project:...”),我还是能够让它正常工作。感谢您的帮助。 - brildum
很高兴听到这个好消息,很高兴你已经能够运行了! - samplebias

11

说句实话,在这里好像没有人回答这个问题,但我使用以下命令行有些成功:

vi_cv_path_python=/usr/bin/python26 ./configure --includedir=/usr/include/python2.6/  --prefix=/home/bcrowder/local --with-features=huge --enable-rubyinterp --enable-pythoninterp --disable-selinux --with-python-config-dir=/usr/lib64/python2.6/config

1
这对我有用。我在$HOME中有一个本地构建的Python 2.7前缀,而vim构建似乎拒绝找到它。 - JeffG
你建议我们把这放在哪里? - Andy Hayden

6
我希望能为您提供一份与Crowder类似的解决方案,该方案对于我而言十分有效。请想象一下,您已经在/opt/Python-2.7.5中安装了Python,并且该文件夹的结构如下:
$ tree -d -L 1 /opt/Python-2.7.5/
/opt/Python-2.7.5/
├── bin
├── include
├── lib
└── share

您希望使用该版本的Python构建vim。您只需要执行以下操作:
$ vi_cv_path_python=/opt/Python-2.7.5/bin/python ./configure  --enable-pythoninterp --prefix=/SOME/FOLDER

因此,只需将vi_cv_path_python变量明确地提供给configure脚本,它就会自动推断出所有内容(甚至是配置目录)。
这在vim 7.4+上进行了多次测试,最近还在vim-7-4-324上进行了测试。

谢谢。您的回复帮助我使用自定义/专有的Python安装编译了Vim。 - Sudipta Basak

1

我在我的系统上遇到了三个不同版本的Python出现了相同的问题。

对我来说,最简单的方法是更改我的$PATH环境变量,以便找到我想要的Python版本所在的文件夹(在我的情况下是/usr/local/bin)比其他文件夹先被找到。


仅仅设置$PATH对我来说不起作用,我必须使用我在答案中列出的vi_cv_path_python调用显式地进行直接配置。 - crowder

0

在编译vim80时,系统自带的python版本是2.6,我在~/local/bin下安装了另一个python 2.7。为了让编译工作正常,我需要:

  1. 更新$PATH变量,将我的python路径放在前面
  2. 添加软链接,ln -s python python2(配置文件会尝试通过探测python2来定位python配置)
  3. 在重新运行./configure之前执行make distclean以确保没有缓存错误值被选中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接