无法导入名称“_gi”

35
我正在尝试使用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)

我在使用Ubuntu和Python3.7,尝试了很多解决方案,但都无法解决问题:
$ 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 文件可以成功。

感谢您的帮助!


我有一些在Python3.6上运行的GTK项目,我将把每个项目都改成更高版本的Python,比如3.7或之后的版本。如果我在第一个项目上使用这些修复方法,会不会影响其他仍然在3.6上的项目?还是说我需要确保在每个想要运行项目的系统上都保留3.6版本? - undefined
6个回答

56

多亏了Wilhelm在这条评论中的建议,我找到了解决方法:

sudo ln -s /usr/lib/python3/dist-packages/gi/_gi.cpython-{36m,37m}-x86_64-linux-gnu.so
这对我来说在Ubuntu上与Python 3.7一起使用有效。


7
请问您需要这个解决方法的简要说明吗? - Leogout
2
这对我也起作用。我安装了Python 3.7和3.8,但遇到了同样的问题。将{36m,37m}替换为{35m,37m,38}可以创建37m38的两个符号链接。这使我能够再次打开gnome-terminal - mathiass
必须对 gi/_gi.cpython、gi/_gi_cairo.cpython 和 cairo/_cairo.cpython 进行操作。 - Nonoreve
非常感谢,尝试了这个命令后,方案一解决了我的问题。 - Tanishq Vyas
1
请注意,在使用该命令时,您应该位于“/usr/lib/python3/dist-packages/gi/”目录中,以便在那里创建链接。 - PhoneixS
显示剩余2条评论

31

Ubuntu不喜欢将其默认解释器从Python 3.7切换回去。

因此,使用以下方法将其切换回3.6:

sudo update-alternatives --config python3

然后尝试安装gi包:

sudo apt install python3-gi

1
你使用的Python解释器是什么?也就是说,当你输入“python3”时,会显示哪个版本? 并且,你能在你的Python3解释器中输入“import gi”吗? - MSpiller
1
我正在使用Python 3.7.5和GCC 8.3,当我写入import gi时出现了Traceback。 - Hugo Sohm
1
我正在使用Ubuntu 18.04.3 LTS,命令python3 -m pip install gi无法工作,它返回No matching distribution found for gi - Hugo Sohm
Ubuntu不太喜欢使用其他Python解释器来运行系统。您可以尝试切换回Python3.6 sudo update-alternatives --config python3,然后重新安装。 - MSpiller
19
使用hacky方法修复Python3.7的兼容问题:sudo ln -s /usr/lib/python3/dist-packages/gi/_gi.cpython-{36m,37m}-x86_64-linux-gnu.so - Wilhelm
显示剩余3条评论

14

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

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

1
你能解释一下这个东西是做什么的吗? - fsevenm
1
@fsevenm,它只是使用python3.6二进制文件来运行apt-add-repository,解决了在“python3.7+”上存在的库冲突问题。对我而言,这个问题只出现在添加repo时。所以我不想改变默认版本的Python。但你可以像接受的答案建议的那样改回旧版本。 - Souza
1
这个解决方案适用于我在Ubuntu 18.04上,而且我之前已经升级了Python到3.7版本。其他建议使用“ln -s”并没有意义,因为它们甚至没有提供目标。用法:ln -s 源文件 目标文件。 - oldpride
1
如果您只想运行apt-add-repository,则最佳解决方案。不会留下任何副作用。 - Wei Shi

8

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

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

谢谢!但我想知道为什么会发生这种情况,以及如何避免它?我发现这个名称错误在许多场景中都会发生。 - Sailist

3

当您运行命令 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。完成。


3

按照以下步骤解决问题:

(1) ls -al /usr/bin | grep python

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

然后将 !/usr/bin/python3 更改为

!/usr/bin/python3.6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接