使用特定版本的Python编译vim
我正在做几个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/bin
在PATH
环境变量的最前面。
5 个回答
我想分享一个和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
上进行了测试。
说实话,这里似乎没有人回答这个问题,我用下面这样的命令行取得了一些成功:
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
我建议你在两个解释器上构建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']