【问题标题】:ImportError: cannot import name '_remove_dead_weakref'ImportError:无法导入名称“_remove_dead_weakref”
【发布时间】:2018-07-05 23:55:03
【问题描述】:

昨天更新了我的 ubuntu 17.04 到 ubuntu 17.10。任何cmets?当我尝试在 pycharm 中运行服务器时出现。 #django 项目。

bash -cl "/home/encuentrum/venv-encuentrum3/bin/python /usr/share/pycharm/helpers/pycharm/django_manage.py check /home/encuentrum/GitLab/encuentrum3/ENCUENTRUM/packers_"
Traceback (most recent call last):
  File "/usr/share/pycharm/helpers/pycharm/django_manage.py", line 5, in <module>
    from pycharm_run_utils import adjust_django_sys_path
  File "/usr/share/pycharm/helpers/pycharm/pycharm_run_utils.py", line 4, in <module>
    import imp
  File "/home/encuentrum/venv-encuentrum3/lib/python3.6/imp.py", line 19, in <module>
    from importlib._bootstrap import _ERR_MSG, _exec, _load, _builtin_from_name
  File "/home/encuentrum/venv-encuentrum3/lib/python3.6/importlib/__init__.py", line 57, in <module>
    import types
  File "/home/encuentrum/venv-encuentrum3/lib/python3.6/types.py", line 171, in <module>
    import functools as _functools
  File "/home/encuentrum/venv-encuentrum3/lib/python3.6/functools.py", line 23, in <module>
    from weakref import WeakKeyDictionary
  File "/home/encuentrum/venv-encuentrum3/lib/python3.6/weakref.py", line 12, in <module>
    from _weakref import (
ImportError: cannot import name '_remove_dead_weakref'

【问题讨论】:

  • 尝试为项目重新创建虚拟环境。
  • 感谢 Alasdair,但将 psycopg2 升​​级到最新版本到 2.7.3.2 后问题得到解决

标签: python django pycharm


【解决方案1】:

可能你混合了多个 Python 安装,较新版本的weakref 与较旧版本的 Python 二进制不兼容,尝试删除任何一个(推荐较旧的)Python 安装。

分析

就我而言,我之前安装了旧版本的 Python (3.5.1),并升级了我的 Debian 安装。较新的 Debian 将其 Python3.5 升级到 3.5.3,在其 Python 二进制文件中 _weakref 中包含 _remove_dead_weakref

当我输入$ where python3.5 时,我得到

/usr/local/bin/python3.5    
/usr/local/bin/python3.5    
/usr/bin/python3.5

/usr/local/bin/python3.5 是我自己的旧安装,/usr/bin/python3.5 是 Debian 官方 Python3.5

当我通过 apt-get 更新我的 Python3.5 安装时,apt-get 在 deb 包中执行 python3.5 -E -S /usr/lib/python3.5/py_compile.py $files(安装后脚本),它会触发弱引用问题,这是我的日志

Setting up python3.5-minimal (3.5.3-1+deb9u1) ...
Traceback (most recent call last):
  File "/usr/lib/python3.5/py_compile.py", line 6, in <module>
    import importlib._bootstrap_external
  File "/usr/lib/python3.5/importlib/__init__.py", line 57, in <module>
    import types
  File "/usr/lib/python3.5/types.py", line 166, in <module>
    import functools as _functools
  File "/usr/lib/python3.5/functools.py", line 23, in <module>
    from weakref import WeakKeyDictionary
  File "/usr/lib/python3.5/weakref.py", line 12, in <module>
    from _weakref import (
ImportError: cannot import name '_remove_dead_weakref'

我用相同的导入操作测试了 Python 3.5.1 和 Python 3.5.3,这里是比较

来自 apt-get 的官方 Python 3.5.3

Python 3.5.3 (default, Sep 27 2018, 17:25:39) 
[GCC 6.3.0 20170516] on linux
>>> from _weakref import _remove_dead_weakref
>>> 

我自己的 Python 3.5.1 安装

Python 3.5.1 (default, Apr 23 2016, 16:40:21) 
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> from _weakref import _remove_dead_weakref
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name '_remove_dead_weakref'
>>> 

所以,我确认/usr/local/bin/ 中的python3.5 不能使用_remove_dead_weakref。 但是 apt-get 在安装后脚本中使用了哪个 python?试试看。

$ which python3.5
/usr/local/bin/python3.5

所以,这就是原因。安装后脚本使用我自定义的 python 安装,以及较新的 python 库 (/usr/lib/python3.5/weakref.py)

修复它!

正如我所说,禁用旧版本的 python

sudo mv /usr/local/bin/python3.5 /usr/local/bin/python3.5.bak

测试

$ which python3.5
/usr/bin/python3.5

【讨论】:

  • 非常感谢。禁用旧版本解决了这个问题。
【解决方案2】:

添加到@Comzyh 答案,这确实是由于由于任何原因发生升级时混合 python 版本。一个快速的解决方法是删除您的 venv python 二进制文件,即rm &lt;path-to-your-env&gt;/bin/python,并将您的系统 python 二进制文件复制到您的 venv,如cp /usr/bin/python &lt;path-to-your-env&gt;/bin/python。这将修复弱引用错误

【讨论】:

    猜你喜欢
    • 2018-11-24
    • 2023-03-13
    • 2019-06-25
    • 1970-01-01
    • 2016-03-31
    • 2014-10-10
    • 2014-09-20
    • 2014-08-28
    • 2014-06-10
    相关资源
    最近更新 更多