【发布时间】:2019-08-20 02:18:30
【问题描述】:
我在 Ubuntu 16.04 上使用 pyenv 安装了多个 Python 版本。我使用pipenv 创建了虚拟环境来处理使用不同版本的项目。但是,对于 Python 3.5.x 仅限,当我尝试在激活的 virtualenv 中使用 Vim 8(通过 PPA 安装)编辑文件时,会出现类似的错误:
"test.py" 49L, 1434C
Error detected while processing function jedi#init_python[4]..<SNR>48_init_python[27]..jedi#setup_python_imports:
line 25:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/user/.local/share/virtualenvs/test-AYf6DmHL/lib/python3.5/imp.py", line 19, in <module>
from importlib._bootstrap import _ERR_MSG, _exec, _load, _builtin_from_name
File "/home/user/.local/share/virtualenvs/test-AYf6DmHL/lib/python3.5/importlib/__init__.py", line 57, in <module>
import types
File "/home/user/.local/share/virtualenvs/test-AYf6DmHL/lib/python3.5/types.py", line 166, in <module>
import functools as _functools
File "/home/user/.local/share/virtualenvs/test-AYf6DmHL/lib/python3.5/functools.py", line 23, in <module>
from weakref import WeakKeyDictionary
File "/home/user/.local/share/virtualenvs/test-AYf6DmHL/lib/python3.5/weakref.py", line 12, in <module>
from _weakref import (
ImportError: cannot import name '_remove_dead_weakref'
这个问题似乎影响了所有与 python 相关的 Vim 插件。对于其他 Python 版本(例如 3.6.x、3.7.x),这不会发生。什么可能导致此问题?
更新:似乎当我在 3.5.x virtualenv 中运行 Vim 时,Vim 的解释器 sys.path 会以某种方式更新。例如,这是 :py3 import sys; print(sys.path) 在 3.6.0 virtualenv 中的输出:
['/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5
/dist-packages', '/usr/lib/python3/dist-packages', '_vim_path_']
这是针对 3.5.3 的:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/testuser/.local/share/virtualenvs/venv-3.5-8feRiT5s/lib/python3.5/imp.py", line 19, in <module>
from importlib._bootstrap import _ERR_MSG, _exec, _load, _builtin_from_name
File "/home/testuser/.local/share/virtualenvs/venv-3.5-8feRiT5s/lib/python3.5/importlib/__init__.py", line 57, in <module>
import types
File "/home/testuser/.local/share/virtualenvs/venv-3.5-8feRiT5s/lib/python3.5/types.py", line 166, in <module>
import functools as _functools
File "/home/testuser/.local/share/virtualenvs/venv-3.5-8feRiT5s/lib/python3.5/functools.py", line 23, in <module>
from weakref import WeakKeyDictionary
File "/home/testuser/.local/share/virtualenvs/venv-3.5-8feRiT5s/lib/python3.5/weakref.py", line 12, in <module>
from _weakref import (
ImportError: cannot import name '_remove_dead_weakref'
['/must>not&exist', '/home/testuser/.local/share/virtualenvs/venv-3.5-8feRiT5s/lib/python35.zip', '/home/testuser/.local/share/virtualenvs/venv-3.5-8feRiT5s/li
b/python3.5', '/home/testuser/.local/share/virtualenvs/venv-3.5-8feRiT5s/lib/python3.5/plat-x86_64-linux-gnu', '/home/testuser/.local/share/virtualenvs/venv-3.
5-8feRiT5s/lib/python3.5/lib-dynload', '/home/testuser/.pyenv/versions/3.5.7/lib/python3.5', '/home/testuser/.local/share/virtualenvs/venv-3.5-8feRiT5s/lib/pyt
hon3.5/site-packages']
该问题可以在ubuntu:16.04 docker 容器中重现。
【问题讨论】:
-
Python 3.5 的版本? stackoverflow.com/a/54949120/7976758 的答案表明您需要更高版本(3.5.3+)并且您必须使用新的 Python 重新创建 virtualenv。
-
我在 Python 3.5.3 和 3.5.7 中使用 virtualenvs,它们有同样的问题。 Ubuntu 16.04 带有系统 python3 v3.5.2,也许它以某种方式干扰了 virtualenv。我还没有为系统本身安装任何额外的 python。
-
安装所有
vim插件时哪个python版本处于活动状态? -
@Tarun:我猜是 3.5.3。实际上,这似乎并不重要。如果我激活 3.5.3 virtualenv 并使用
vim -u NONE启动不带任何插件的 Vim,然后执行命令:py3 import sys; print(sys.version)我会得到完全相同的错误。虽然,版本 3.5.2 已成功打印。在 3.6.x(甚至 3.4.x)virtualenv 中不会发生错误。
标签: python vim virtualenv ubuntu-16.04 python-3.5