【问题标题】:ImportError: cannot import name '_gi' from partially initialized module 'gi' (most likely due to a circular import)ImportError:无法从部分初始化的模块“gi”导入名称“_gi”(很可能是由于循环导入)
【发布时间】:2020-01-21 09:45:22
【问题描述】:

当我想切换到 python 3.8 时,我似乎破坏了我的 python 安装。使用 Ubuntu 18.04。尝试使用gi,会出现以下错误:

$ python
Python 3.8.1 (default, Dec 31 2019, 18:42:42) 
[GCC 7.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
 >>> from gi.repository import GLib, Gio
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/gi/__init__.py", line 42, in <module>
    from . import _gi
ImportError: cannot import name '_gi' from partially initialized module 'gi' (most likely due to a circular import) (/usr/lib/python3/dist-packages/gi/__init__.py)

尝试为 python 运行 update-alternatives,但它告诉我只配置了一个 python 替代方案 (3.8)。

尝试重新安装 python3-gi 和 python3.8。还是一样的问题

【问题讨论】:

  • /usr/bin/pythonpython3 符号链接恢复为python3.6 很可能会为您解决此问题。这里真正的问题是:如何在不破坏一堆东西的情况下让 python 3.8 成为 Ubuntu 的默认版本?

标签: python python-3.x ubuntu


【解决方案1】:

我遇到了同样的问题。我将python3链接到python3.6,对我来说它指向3.8。这样就解决了问题。

cd /usr/bin/
rm python3
ln -s python3.6 python3

仅此而已。现在我的系统开始正常工作了。

【讨论】:

  • 这个解决方案解决了我的问题。为什么会起作用?
  • unlink python3 也可以用来代替rm python3,因为它无论如何都会在下一步中使用。
  • 我希望将 3.8 作为我的默认值
  • 我建议改用update-alternatives,但这是一个很好的解决方案
【解决方案2】:

为python 3.8安装gipython3.8 -m pip install pgi 然后,而不是 import gi 使用:

import pgi
pgi.install_as_gi()
from gi.repository import GLib, Gio

或者,您可以为 python 3.8 强制安装 PyGObject:

sudo python3.8 -m pip install --ignore-installed PyGObject

这应该允许一个人像以前一样from gi import ...

【讨论】:

  • 这解决了我的问题(Python 3.8.5,Ubuntu 18.04,链接不起作用)。
  • 得到这个错误:命令 "/usr/bin/python3.8 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-5puaelnl/pycairo/setup.py' ;f=getattr(tokenize, 'open', open)(file);code=f.read().replace('\r\n', '\n');f.close ();exec(compile(code, file, 'exec'))" install --record /tmp/pip-jkdw0o7c-record/install-record.txt --single-version-externally- managed --compile" 失败,错误代码 1 在 /tmp/pip-build-5puaelnl/pycairo/
  • 为 python3.8 安装 PyGObject 适用于我的系统,默认使用 python3.8。我猜这个问题发生在我安装 python3.8.10 并丢失了对 gnome-terminal 要求的依赖项时。为 python3.8 安装 PyGobject 还需要 pycairo 作为依赖项,这可能会导致您遇到另一个缺少 cario 库的问题。当它发生时,像“sudo apt install libcairo2-dev”一样安装libcairo2(假设你在ubuntu上)
【解决方案3】:

对我来说,解决方法是创建一个符号链接:

cd /usr/lib/python3/dist-packages/gi/
sudo ln -s _gi.so _gi.cpython-38-x86_64-linux-gnu.so

它为我解决了问题。

【讨论】:

    【解决方案4】:

    在这里找到答案https://bugzilla.redhat.com/show_bug.cgi?id=1709787:

    原因是 - /usr/lib64/python3.8/site-packages/gi/_gi.cpython-38m-x86_64-linux-gnu.so 名称不正确:

    sh-5.0# python3 -c '从 gi.repository 导入 GLib' 回溯(最近一次通话最后): 文件“”,第 1 行,在 文件“/usr/lib64/python3.8/site-packages/gi/init.py”,第 42 行,在 从 。导入_gi ImportError: 无法从 'gi' (/usr/lib64/python3.8/site-packages/gi/init.py) 导入名称 '_gi' sh-5.0# mv /usr/lib64/python3.8/site-packages/gi/_gi.cpython-38m-x86_64-linux-gnu.so /usr/lib64/python3.8/site-packages/gi/_gi. cpython-38-x86_64-linux-gnu.so sh-5.0# python3 -c '从 gi.repository 导入 GLib'

    请注意,从 3.8.0a4 开始,“m”不应该在那里。它是否以某种方式硬编码?

    sh-5.0# python3-config --extension-suffix .cpython-38-x86_64-linux-gnu.so

    在我的情况下是

    $ sudo ln -s /usr/lib/python3/dist-packages/gi/_gi.cpython-35m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/gi/_gi.cpython-38-x86_64-linux-gnu.so
    $ sudo ln -s /usr/lib/python3/dist-packages/gi/_gi_cairo.cpython-35m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/gi/_gi_cairo.cpython-38-x86_64-linux-gnu.so
    

    【讨论】:

    • 对我不起作用。
    【解决方案5】:

    有同样的问题,无法从脚本文件夹加载模块。在我的情况下,如果我更改 workdir 例如(但仅适用于内联命令):

    cd /tmp; python -c 'from gocd import Server'
    echo $?
    0
    

    将脚本复制到/tmp后,它不起作用

    cp gocd.py /tmp
    cd /tmp; python -c 'from gocd import Server'
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/gocd.py", line 3, in <module>
        from gocd import Server
    ImportError: cannot import name 'Server' from partially initialized module 'gocd' (most likely due to a circular import) (/tmp/gocd.py)
    

    【讨论】:

    • 这个问题的答案如何?
    【解决方案6】:

    这个错误的原因是这个应用找不到匹配的Python版本_gi_cairo.cpython-(version)-x86_64-linux-gnu.so.
    通常情况下,这种不匹配的情况是由于不同版本的Python的一些错误混合使用造成的。

    所以基本上,您可以尝试切换您的 Python 版本(到您的操作系统的默认版本)。或者你可以去 '/usr/lib/python3/dist-packages/gi' 并创建一个新的 .so 库文件:

    cp _gi_cairo.cpython-(old version)-x86_64-linux-gnu.so _gi_cairo.cpython-(new version)-x86_64-linux-gnu.so
    

    ln -s _gi_cairo.cpython-(old version)-x86_64-linux-gnu.so _gi.so
    

    【讨论】:

      【解决方案7】:

      我在 ubuntu 18 上遇到了同样的问题,因为 python3 指的是 python3.9。 为了解决它,我改变了python3的替代方案:

      sudo update-alternatives --config python3                                                                                                                                                                  
      There are 2 choices for the alternative python3 (providing /usr/bin/python3).
      
        Selection    Path                Priority   Status
      ------------------------------------------------------------
      * 0            /usr/bin/python3.9   2         auto mode
        1            /usr/bin/python3.6   1         manual mode
        2            /usr/bin/python3.9   2         manual mode
      

      通过选择数字 1,现在 python3 指向 python3.6 并且一切正常

      【讨论】:

        猜你喜欢
        • 2021-02-24
        • 2022-06-22
        • 2022-01-08
        • 2020-05-20
        • 2021-11-28
        • 1970-01-01
        • 1970-01-01
        • 2023-02-12
        • 2021-09-22
        相关资源
        最近更新 更多