使用特定版本的Python编译vim

26 投票
5 回答
17094 浏览
提问于 2025-04-16 16:54

我正在做几个Python项目,这些项目运行在不同版本的Python上。我希望能把我的vim环境设置成使用ropevim、pyflakes和pylint,但遇到了一些问题,因为我用的vim是为特定版本的Python编译的,而这个版本和我项目的Python版本不匹配。

我想在每个虚拟环境目录里编译vim,但遇到了一些麻烦,搞不定。当我尝试从源代码编译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解释器?

注意:我可以确认/virtualenv/project/binPATH环境变量的最前面。

5 个回答

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上进行了测试。

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
13

我建议你在两个解释器上构建vim,然后使用我下面提供的脚本来启动它,这样可以指向特定的虚拟环境。

我能够使用以下命令在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,尽管配置时会显示虚拟环境的路径:

% 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的脚本,这个脚本在调用系统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']

撰写回答