YouCompleteMe/Python能完成内置库,但无法完成site-packages

8 投票
4 回答
3455 浏览
提问于 2025-04-18 10:40

我刚安装了ycm,一切看起来都不错,但我发现了一个小问题。这个问题如下:

import os    # os is built-in library
os.          # ycm helps to complete members of the class.
import numpy # numpy is not built-in library, where its location is site-packages. 
numpy.       # nothing happened. ycm shows 'pattern not found' message.

我觉得这个问题应该很简单。但是我还没有找到解决办法。我想,应该有一个配置文件,我可以在里面为我的项目定义“搜索路径”。

如果我能找到解决办法,那就太好了。

祝好,

Je-Hoon Song

4 个回答

0

一个简单的解决办法是先激活你的 Python 环境,然后打开 vim。比如说:

(django_mdn) ➜  locallibrary git:(master) ✗ vim

在 vim 中运行 :echo $PATH

这样你应该能看到你的虚拟环境路径在最前面,像这样:

/Users/gwanghyeongim/.virtualenvs/django_mdn/bin:/usr/local/opt/tcl-tk/bin:...

然后检查一下你的 Python 包是否可以自动补全。

在这里输入图片描述

这样就成功了。

如果你想让某个特定的 site-packages 永久自动补全,你需要在项目的根目录下创建一个叫 .ycm_extra_conf.py 的文件,或者创建 global_extra_conf.py,如果你想全局设置的话,还需要设置 vim 配置

补充说明:
在打开 vim 之前在终端运行 export PYTHONPATH=/usr/lib/python3.4/site-packages/ 对我来说没有用。而且,除非你永久设置 PYTHONPATH,否则每次想要自动补全依赖时都得重新设置 export PYTHONPATH

0

numpy 是一个比较复杂的库,因为它在导入时会动态地创建自己的命名空间。这就导致一些静态代码分析工具在你写代码的时候,无法准确知道有哪些名称是可以使用的。实际上,numpy 中可用的名称只有在程序运行时才能确定,所以 YCM 可能无法给你提供有用的建议。

1

我在使用Anaconda Python作为我的YCM(YouCompleteMe)中的Python解释器来解决这个问题。首先,我根据Vim中的完整Python设置修改了我的vimrc文件。然后,我通过以下方式更改了g:ycm_python_interpreter_path

let g:ycm_python_interpreter_path = '/usr/local/anaconda3/bin/python3.8'

这样我就没有改变系统的环境变量。

附加信息 1: 我认为主要问题是,我的YCM的Python解释器是系统自带的Python(/usr/local/opt/python@3.9/bin/python3.9),它只包含有限的本地库。所以使用Anaconda自带的库(/usr/local/anaconda3/bin/python3.8)可以解决这个问题。

附加信息 2: 通过查看:YcmDebugInfo,在编辑g:ycm_python_interpreter_path后,主要的不同是:

-- Python completer debug information:
--   Python interpreter: /usr/local/opt/python@3.9/bin/python3.9
--   Python path: ['/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python39.zip', '/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9', '/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload', '/usr/local/lib/python3.9/site-packages']
--   Python version: 3.9.6

变更为

-- Python completer debug information:
--   Python interpreter: /usr/local/anaconda3/bin/python3.8
--   Python path: ['/usr/local/anaconda3/lib/python38.zip', '/usr/local/anaconda3/lib/python3.8', '/usr/local/anaconda3/lib/python3.8/lib-dynload', '/usr/local/anaconda3/lib/python3.8/site-packages', '/usr/local/anaconda3/lib/python3.8/site-packages/aeosa', '/usr/local/anaconda3/lib/python3.8/site-packages/locket-0.2.1-py3.8.egg']
--   Python version: 3.8.8

附加信息 3:关于如何查看本地安装的Python模块列表 可以使用https://stackoverflow.com/a/740018/11226687,例如在我的情况下:

$ /usr/local/opt/python@3.9/bin/python3.9
>>> help('modules')
# only return limitted modules
$ /usr/local/anaconda3/bin/python3
>>> help('modules')
# list out all the modules included in Anaconda, including numpy/matplotlib/scipy ect
7

我也遇到了和'mpmath'模块一样的问题,后来我这样解决的:

首先,我找到了这个模块所在的路径:

%python3
>>>import mpmath
>>>print(mpmath.__file__)
/usr/lib/python3.4/site-packages/mpmath/__init__.py

在这里,我发现我所有“安装的”python3包的路径是:

/usr/lib/python3.4/site-packages/

然后,我简单地把这个路径添加到了我的PYTHONPATH环境变量中:

%export PYTHONPATH=/usr/lib/python3.4/site-packages/

接着,当我用vim sample.py打开文件,输入import mpmath,然后再输入mpmath.时,YCM就给我显示了所有与mpmath模块相关的自动补全选项。

希望这对你有帮助。

撰写回答