vim编译了错误的python版本(且无法使用所需版本)

25 投票
8 回答
8998 浏览
提问于 2025-04-17 01:21

简而言之:

我在编译vim的时候遇到了问题,想用我喜欢的python版本。
当我使用 --enable-pythoninterp 时,它会用系统自带的OSX python版本来编译。
而当我使用 --enable-pythoninterp=dynamic 时,在vim里尝试 :py import sys 时就会出错。

下面是我更详细的操作过程:

% git clone https://github.com/b4winckler/macvim.git
% cd macvim
% ./configure --enable-pythoninterp \
     --with-python-config-dir=/usr/local/lib/python2.7/config <- this option has no affects on result
...
checking for python... /usr/local/bin/python
checking Python version... 2.7
checking Python is 1.4 or better... yep
checking Python's install prefix... /usr/local
checking Python's execution prefix... /usr/local
checking Python's configuration directory... /usr/local/lib/python2.7/config
...
% make
...
** BUILD SUCCEEDED **
% open src/MacVim/build/Release/MacVim.app

在打开的MacVim里,我输入:

:py import sys; print (sys.version, sys.executable)
('2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
  [GCC 4.2.1 (Apple Inc. build 5646)]',
 '/usr/bin/python')

为什么是 2.6.1?
为什么是 /usr/bin/python?
我的默认python是2.7!它在 /usr/local/bin/python

我整整一天都在寻找解决方案,最后找到了。就是 =dynamic 这个属性(不过这个解决方案没有解释)。

之后我尝试用动态python重新编译vim:

% ./configure --enable-pythoninterp=dynamic
... output the same ...
% make
% open src/MacVim/build/Release/MacVim.app

在打开的MacVim里:

:py import sys

结果出现了一个错误:

E370: Could not load library libpython2.7.a
E263: Sorry, this command is disabled, the Python library could not be loaded.

我的OSX版本是10.6.8。
默认的python版本是2.7。

% which python
/usr/local/bin/python

有没有人能解释一下在编译过程中python是如何集成到vim里的?
还有如何解决libpython2.7.a的错误?


更新:我现在没有问题中描述的环境了,所以无法测试新的答案。不过其他人会感谢你们的帮助。

8 个回答

5

我之前也遇到过和你一样的问题(想用Python 2.7编译MacVim),最后我终于搞定了。

首先,dynamic这个选项是没用的!我在网上也看到过这个建议,但如果你查看配置脚本(或者直接看帮助信息),会发现它根本不被认可。所以别用这个选项。这就相当于禁用了Python,这就是为什么:py不工作的原因。你没有用Python编译MacVim。

我最后做的是通过Python 官网上的官方安装程序重新安装了Python 2.7.2。这样你应该在/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config目录下找到一个config文件。

然后再试着用以下选项编译:

% ./configure --enable-pythoninterp \
   --with-python-config-dir=/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config/python2.7/config

编译结束时我遇到了一个错误,但如果我忽略这个错误,直接运行生成的程序,还是可以正常工作的。这个问题可能是我电脑特有的(似乎和图标的安装有关)。祝你好运。

需要注意的是,这就是我用Python 2.7编译MacVim的方法(这是我的目标),不一定是用我当前Python版本编译的方式。

7

我也遇到过同样的问题。我是从源代码编译了Macvim,然后想用macports里的Python 2.7。

/opt/local/bin/python

但是有些模块找不到,比如os模块。原因是macvim里面的PYTHONPATH变量设置错了!

为了测试,打开macvim,输入:

:python print sys.path

我得到了以下路径(注意最后的部分,真是没意义):

...
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.5/'
...

我猜测问题出在链接器的标志“-framework Python”上。这个标志让它找到了错误的,也就是系统的Python框架。如果我把src/auto/configure脚本中的这一行:

if test "x$MACOSX" = "xyes" && ${vi_cv_path_python} -c \
"import sys; sys.exit(${vi_cv_var_python_version} < 2.3)"; then
      vi_cv_path_python_plibs="-framework Python"

改成

if test "x$MACOSX" = "xyes" && ${vi_cv_path_python} -c \
"import sys; sys.exit(${vi_cv_var_python_version} < 2.3)"; then
      vi_cv_path_python_plibs="-F/opt/local/Library/Frameworks -framework Python"

然后再运行configure,清理后重新编译,Macvim就能正常工作了。-F这个标志告诉链接器在哪个目录找接下来的框架。Macports会把Python.framework安装在这个目录,具体情况可能会有所不同。

10

我的解决办法是删除一个配置缓存文件,这个文件是我之前用OSX自带的python构建时生成的。

然后我用Homebrew安装了一个新的python版本,但即使我更新了我的PATH变量,并且用"which python"命令确认了正确的python版本,.configure还是无法识别这个新版本。

删除缓存文件后重新运行配置命令,问题就解决了。

rm src/auto/config.cache
./configure --enable-pythoninterp

希望这对其他人也有帮助。

撰写回答