在 vim 中安装 YouCompleteMe 时遇到 python 的困难

Posted

技术标签:

【中文标题】在 vim 中安装 YouCompleteMe 时遇到 python 的困难【英文标题】:Difficulty with python while installing YouCompleteMe in vim 【发布时间】:2017-02-27 17:51:05 【问题描述】:

我已经关注these instructions,为了在 Vim 中安装 YouCompleteMe,但是当我发出:

./install.py --clang-completer

出现以下错误信息:

Searching Python 2.7 libraries...
ERROR: found static Python library (/usr/local/lib/python2.7/config/libpython2.7.a) but a dynamic one is required. You must use a Python compiled with the --enable-shared flag. If using pyenv, you need to run the command:
  export PYTHON_CONFIGURE_OPTS="--enable-shared"
before installing a Python version.
Traceback (most recent call last):
  File "./install.py", line 44, in <module>
    Main()
  File "./install.py", line 33, in Main
    subprocess.check_call( [ python_binary, build_file ] + sys.argv[1:] )
  File "/usr/local/lib/python2.7/subprocess.py", line 540, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/usr/local/bin/python', u'/home/anmol/.vim/bundle/YouCompleteMe/third_party/ycmd/build.py', '--clang-completer']' returned non-zero exit status 1

现在我卡住了,我该怎么办?

【问题讨论】:

您使用的是哪个操作系统?我假设一个 Linux 发行版,哪个? 【参考方案1】:

我检查了 YouCompleteMe 的构建系统,它使用了一个自定义构建脚本,该脚本使用 Python 模块 distutils 来查找 Python 库的路径并包含目录。您的/usr/local/ Python 安装可能包含在您的PATH 变量中,然后是正式的/usr 安装,因此仅运行python 可能会运行您的自定义安装,从而使distutils 返回其目录。

要检查这是否属实,请尝试运行which python。我认为它会返回类似/usr/local/bin/python

此时,我看到了几个选项(按优先顺序)。

    通过指定应显式运行哪个 Python 可执行文件来尝试运行 YCM 的安装脚本:/usr/bin/python ./install.py --clang-completer

    如果您在 YCM 中使用任何其他完成器,则应在上述行中添加适当的标志(例如,--js-completer 用于 javascript 完成)。

    编辑 YouCompleteMe 插件目录中的脚本 third_party/ycmd/build.py 以硬编码自定义 Python 安装的路径。例如,您可以将现有的 FindPythonLibraries 函数替换为以下内容:

    def FindPythonLibraries():
        return ('/usr/lib/python2.7/config-x86_64-linux-gnu/libpython2.7.so',
                '/usr/include/python2.7')
    

    请注意,这会使更新 YouCompleteMe 变得更加困难,因为您必须确保在更新其源代码时它不会被覆盖。

    将自定义安装的 Python 替换为构建为共享库的 Python。这方面的细节将取决于您如何安装现有的 Python 安装。您可以使用dpkg -S /usr/local/lib/python2.7/config/libpython2.7.a 来检查您是否通过软件包安装了它。此命令将告诉您哪个软件包安装了该文件,除非您手动安装(绕过软件包管理器)。 删除您的自定义/usr/local Python 安装,同时确保您已安装来自官方存储库(包python2.7libpython2.7)的Python。

从长远来看,使用官方 Python 包可能会更好。

【讨论】:

第一个选项也对我有用;我使用了系统范围的 python 而不是 pyenv 安装。 /usr/bin/python ./install.py --js-completer --clang-completer 谢谢! +1:仍然是pyenv 安装的最新答案。有效期:/usr/bin/python ./install.py --js-completer --clang-completer 已确认。作为旁注,还要确保 python 模块 requests 在你的盒子上,否则构建将失败...... @JREAM 做了同样的事情,但使用了/usr/bin/python3【参考方案2】:

该插件为我在同一操作系统上构建。配置中的相关行如下所示:

Found PythonLibs: /usr/lib/python2.7/config-x86_64-linux-gnu/libpython2.7.so

可以识别共享对象属于libpython2.7包:

apt-file search /usr/lib/python2.7/config-x86_64-linux-gnu/libpython2.7.so
libpython2.7: /usr/lib/python2.7/config-x86_64-linux-gnu/libpython2.7.so

所以我会检查你是否有命名的文件,如果没有,请尝试sudo apt install libpython2.7,否则尝试移除静态版本,或者让我们知道你是如何安装 Python 的。

【讨论】:

找到了所需的文件,移开静态版本也没有帮助,同样的错误再次发生。我不完全记得我是如何安装 python 的,但很可能是通过命令行安装的。有什么方法可以将静态版本转换为动态版本? 您似乎没有 Ubuntu 开箱即用的标准设置,因为没有 /usr/local/lib/python2.7/config/ 目录。那么reinstalling the whole Python呢? (虽然这有可能破坏事情......) 我已经安装了其他几个与python相关的文件,在第一次安装python之后主要作为其他软件的依赖项,如果我重新安装python它们不会被删除,而且它也不能保证解决我的问题问题。 他们会的。为了更安全的选择,您可以尝试移开整个/usr/local/lib/python2.7/config/。或者想办法tell cmake which Python to use。 另一种选择,也许你已经安装了 Python 3,所以我也试试:python3 ./install.py --clang-completer

以上是关于在 vim 中安装 YouCompleteMe 时遇到 python 的困难的主要内容,如果未能解决你的问题,请参考以下文章

兼容 Vim 的 JS 检查器(Syntastic | YouCompleteMe)?

CentOS中安装YouCompleteMe插件全过程

docker容器中安装vim

manjaro下vim配置和YouCompleteMe插件的安装

docker容器中安装vim

clearriver docker容器中安装vim