在 3.5.3 virtualenv 中运行时,Vim 中的 Python 错误

Posted

技术标签:

【中文标题】在 3.5.3 virtualenv 中运行时,Vim 中的 Python 错误【英文标题】:Python error in Vim when run inside a 3.5.3 virtualenv 【发布时间】: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 的版本? ***.com/a/54949120/7976758 的答案表明您需要更高版本(3.5.3+)并且您必须使用新的 Python 重新创建 virtualenv。 ***.com/… 我在 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 中不会发生错误。 【参考方案1】:

可能是其他 python 版本在这里干扰。你有PYTHONPATH 设置吗?

echo $PYTHONPATH

如果已设置,您可以尝试取消设置。使用虚拟环境时通常不需要。

【讨论】:

问题是关于虚拟环境,所以$PYTHONPATH已设置,无法取消设置。 我知道它与虚拟环境有关,但在使用虚拟环境时不一定要设置 $PYTHONPATH。我的意思是 $PYTHONPATH 而不是 $PATH。我的想法是它们与不同的 python 版本发生了某种冲突。 sys.path 已设置,我的意思是说“无法取消设置”。 我已经检查过了,$PYTHONPATH 未设置。【参考方案2】:

尝试使用 sudo 运行 python。我认为操作系统自带的python需要管理员权限才能运行。

【讨论】:

【参考方案3】:

Debian Bug report logs - #852163: python3.5-minimal wont configure 表明此错误(对于 Python 3.5 和 Python 3.6)是由于 /usr/local 中另一个不兼容的 Python 安装造成的。

与#debian 中遇到此问题的另一位用户进行进一步挖掘 问题表明它与本地安装的有关 /usr/local/bin/python3.5. /usr/lib/python3.5 中的 stdlib 由 /usr/local/bin/python3.5 但不兼容,导致 显示堆栈跟踪。

从中删除 /usr/local/bin/python3* 和该安装的所有痕迹 /usr/local/lib(加上其他相关工具)为用户解决了这个问题 我在#debian 中提供帮助。

-- 斯图尔特·普雷斯科特 (link)

问题是系统安装的python导致的,和个人安装的python冲突。

【讨论】:

除了库存 2.7.12 和 3.5.2 之外,我的系统上没有任何 Python 版本。正如我所提到的,Vim 的问题可以在干净的 docker 容器中重现。只需从链接的 PPA 安装最新的 Vim,pyenv(以创建 Python 3.5.3 虚拟环境)和可选的pipenv。然后在 3.5.3 的虚拟环境中运行vim -c 'py3 import sys' 就会出现上述错误。

以上是关于在 3.5.3 virtualenv 中运行时,Vim 中的 Python 错误的主要内容,如果未能解决你的问题,请参考以下文章

从 django 应用程序调用 unoconv 的问题,在 virtualenv 中运行

在 postgres 中运行时查询计划更改

为啥我的代码在线程 6:NSOperationQueue 中运行时会崩溃?

服务在android中运行时弹出窗口

当程序在 IntelliJ 中运行时,为啥我会收到 SSLHandshakeException 作为 JAR?

程序在tkinter中运行时如何制作新标签?