YouCompleteMe/Python能完成内置库,但无法完成site-packages
我刚安装了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 个回答
一个简单的解决办法是先激活你的 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
。
numpy
是一个比较复杂的库,因为它在导入时会动态地创建自己的命名空间。这就导致一些静态代码分析工具在你写代码的时候,无法准确知道有哪些名称是可以使用的。实际上,numpy
中可用的名称只有在程序运行时才能确定,所以 YCM 可能无法给你提供有用的建议。
我在使用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
我也遇到了和'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模块相关的自动补全选项。
希望这对你有帮助。