【问题标题】:Cannot import name '_gi'无法导入名称“_gi”
【发布时间】:2021-12-07 20:35:22
【问题描述】:

我正在尝试使用 add-apt-repository 命令将存储库添加到 ppa,但未找到 Python 中的 _gi 模块。

我做了这个命令:sudo add-apt-repository ppa:s-mankowski/ppa-kf5

这是回溯:

Traceback (most recent call last):
  File "/usr/bin/add-apt-repository", line 11, in <module>
    from softwareproperties.SoftwareProperties import SoftwareProperties, shortcut_handler
  File "/usr/lib/python3/dist-packages/softwareproperties/SoftwareProperties.py", line 67, in <module>
    from gi.repository import Gio
  File "/usr/lib/python3/dist-packages/gi/__init__.py", line 42, in <module>
    from . import _gi
ImportError: cannot import name '_gi' from 'gi' (/usr/lib/python3/dist-packages/gi/__init__.py)

我在使用 Python3.7 的 Ubuntu 上,我尝试了很多解决方案,但它不起作用:

$ cd /usr/lib/python3/dist-packages
$ sudo ln -s apt_pkg.cpython-{36m,37m}-x86_64-linux-gnu.so

$ cd /usr/lib/python3/dist-packages/gi
$ sudo ln -s _gi.cpython-{36m,37m}-x86_64-linux-gnu.so

我不能使用 sudo add-apt-repository ppa:s-mankowski/ppa-kf5 命令,但使用 python3 {file} 运行 Python 文件可以。

感谢您的帮助!

【问题讨论】:

    标签: python ubuntu pi


    【解决方案1】:

    感谢a comment by Wilhelm,我发现解决办法是:

    sudo ln -s /usr/lib/python3/dist-packages/gi/_gi.cpython-{36m,37m}-x86_64-linux-gnu.so
    

    这对我在 Ubuntu 上使用 Python 3.7 有效。

    【讨论】:

    • 您能否简要说明如何解决此问题?
    • 这对我也有用。它正在创建一个指向现有 3.6 库的符号链接,该库被命名为 3.7 库。我的假设是 python 3.7 无法加载 3.6 库,这以与askubuntu.com/a/1207369 类似的方式修复
    • 这也适用于我。我安装了 python 3.7 和 3.8 并且遇到了同样的问题。将{36m,37m} 替换为{35m,37m,38} 会为37m38 创建两个符号链接。这让我可以再次打开gnome-terminal
    • 从 py 3.5 切换到 py 3.8 时,sudo ln -s /usr/lib/python3/dist-packages/gi/_gi.cpython-35m-x86_64-linux-gnu.so _gi.cpython-38-x86_64-linux-gnu.so 也有效
    • 必须对 gi/_gi.cpython gi/_gi_cairo.cpython 和 cairo/_cairo.cpython 都这样做
    【解决方案2】:

    Ubuntu 不喜欢将其默认解释器从 python 3.7 切换出来。

    所以使用

    将其切换回 3.6
    sudo update-alternatives --config python3
    

    之后尝试安装gi 包:

    sudo apt install python3-gi
    

    【讨论】:

    • 你的python解释器是什么? IE。当您键入python3 时,会显示哪个版本?你能在你的python3解释器中输入import gi吗?
    • 我正在使用 Python 3.7.5 和 GCC 8.3,当我写 import gi 时,Traceback 就在那里
    • 哪个版本的 Ubuntu?您也可以尝试:python3 -m pip install gi卸载后python3-gi
    • 我正在使用 Ubuntu 18.04.3 LTS 并且命令 python3 -m pip install gi 不起作用,它正在返回 No matching distribution found for gi
    • 一个hacky修复让它与python3.7一起工作sudo ln -s /usr/lib/python3/dist-packages/gi/_gi.cpython-{36m,37m}-x86_64-linux-gnu.so
    【解决方案3】:

    这两个步骤可能对您有所帮助

    $ cd /usr/lib/python3/dist-packages/gi
    $ sudo ln -s _gi.cpython-{36m,37m}-x86_64-linux-gnu.so
    

    【讨论】:

    • 谢谢!但我想知道为什么会发生这种情况以及如何避免它?我发现这个名字错误发生在很多场景中。
    【解决方案4】:

    这是一个老问题,但如果有人需要快速解决方案,这并不意味着在任何地方更改默认 Python 版本,只是:

    sudo python3.6 /usr/bin/apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
    

    【讨论】:

    • 你能解释一下这个东西是做什么的吗?
    • @fsevenm 它只是使用 python3.6 二进制文件来运行 apt-add-repository ,解决了 python3.7+ 上存在的库冲突。对我来说,这个问题只在添加回购时出现。所以我不想在python的默认版本之间进行更改。但是您可以像接受的答案所建议的那样将其改回旧版本。
    • 这个解决方案在 ubuntu 18.04 上为我工作,不久前我将我的 python 升级到了 3.7。 “ln -s”的其他建议没有意义,因为它们甚至没有提供目标。用法:ln -s 源目标。
    【解决方案5】:

    按照以下步骤解决问题。

    (1) ls -al /usr/bin | grep 蟒蛇

    (2) sudo gedit /usr/bin/add-apt-repository

    然后把!/usr/bin/python3改成

    !/usr/bin/python3.6
    

    【讨论】:

      【解决方案6】:

      当您检查 sudo apt install python3-gi 时,它会显示“它已安装到最新版本” 但是你的 import gi 不起作用,所以你应该检查它的目录

      cd /usr/lib/python3/dist-packages/gi
      

      你会看到在我的例子中你使用的是哪个版本的python:“_gi.cpython-38-x86_64-linux-gnu.so”,即 38 => python3.8 所以你应该检查sudo update-alternatives --config python3,看看是否有python3.8指向或没有,如果不是简单地做:

      sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2
      

      并确保您的 python3 指向 python3.8 您可以通过以下方式查看:ls -l /etc/alternatives/python3 完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-11
        • 2020-02-05
        • 2011-07-11
        • 2018-06-11
        • 2014-11-20
        • 2014-03-04
        相关资源
        最近更新 更多