什么原因会导致Python中缺少"gi"模块?

在Ubuntu中对默认的Python版本进行了一些不太聪明的编辑,从2.7改为3.2,结果导致整个系统崩溃。当我的电脑爆炸并且一切停止工作后,我试图恢复我的更改(通过将/usr/bin/python2.7链接到/usr/bin/python并将/usr/share/python/debian_defaults中的默认版本改回2.7),但仍然有一些问题没有解决。
例如,当我在Python解释器中输入import gi时,会出现以下消息:
>>> import gi
 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 ImportError: No module named gi
>>> 

一些程序也会出现错误(例如:gnome tweak tool)。我尝试过从软件中心和源代码重新安装Python,但是仍然出现相同的错误。
现在,python --version返回:
 Python 2.7.2

还有一些依赖于Python 2.7的软件包现在可以正常工作(例如软件中心),但仍然存在一些问题。有没有办法完全重新安装Python 2.7作为默认版本?

你尝试过重新安装python-gobjects吗? - Javier Rivera
我做了,但它重新安装了"python-gobject 3.0.0-0ubuntu4"。这是2.7的正确版本号吗? - Colin Dumitru
是的。它是我系统上安装的,并且正常工作。 - Javier Rivera
你尝试过重新配置Python吗?例如:sudo dpkg-reconfigure python2.7 - sagarchalise
是的,但是同样的错误仍然存在。 - Colin Dumitru
对于那些手动升级到Python 3.7的用户,你只需要编辑/usr/bin/gnome-tweaks文件,并将#!/usr/bin/python3更改为#!/usr/bin/python3.6。在此之后,一切应该正常运行,就像魔术般顺利。 - Aris
尝试运行sudo ibus-setup。说不定会有用的! - Milan
13个回答

我找到了三种方法来做这个:
  1. 简单的方法:

    sudo apt install python3-gi
    
  2. 适用于虚拟环境用户的vext方式:

    pip install vext
    pip install vext.gi
    
  3. 纯Python开发者的方式:

    安装一些开发工具:

    sudo apt install pkg-config libcairo2-dev gcc python3-dev libgirepository1.0-dev
    

    安装Python包:

    pip install PyGObject
    

在这种情况下,软件包是共享的 - 所以适用于两者。已经移除了对Debian的引用,以避免混淆。 - Matthew
1注意:如果你安装了"python3-dev",它可能会升级你已经安装的python3,并且可能会给你带来麻烦,就像之前发生在我身上的那样。 - Doğuş
在我的虚拟环境中安装vext包只是将错误更改为“ImportError:无法从'gi'(/usr/lib/python3/dist-packages/gi/init.py)导入名称'_gi'”。 - Cerin


1这次对我有效的唯一方法 - matanster
这让我今天过得很愉快。 - readyready15728

在这里找到了一个小的解决办法here,对我起了作用。
sudo nano /usr/bin/gnome-tweak-tool

#!/usr/bin/env python 更改为 #!/usr/bin/python

1这个方法解决了我在Arch Linux上的问题!另外一个解决方案是由Jeremy Bicha提供的,在Arch Linux上安装python-gobject(或者在Ubuntu上安装python3-gi),但对我来说没有起作用! - ArchLinuxTux

在终端中运行以下命令:
sudo apt install python3-gi

如果你需要Python2的支持,可以使用以下方法:
sudo apt install python-gi

sudo apt-get install -y python-gobject

在Ubuntu 18.04上为我修复了这个问题。

在我的情况下:
>>> import gi
>>> gi.__file__
'/usr/lib/python2.7/dist-packages/gi/__init__.pyc'

所以你需要检查的是你是否有那个文件可用。如果没有,那就检查一下 /usr/lib/python2.7/dist-packages/gi/__init__.py 是否指向 /usr/share/pyshared/gi/__init__.py。你应该有那个文件,因为你有 python-gobject 3.0.0-0ubuntu4(是的,我也有完全相同的版本)。
如果 gi 包存在,那么你应该查看一下你的 sys.path 输出。如果 /usr/lib/python2.7/dist-packages 没有包含在内,那就添加进去然后再试一次。
一旦导入成功,你可以设置你的 PYTHONPATH 或者进一步调查路径设置不正确的原因。
待处理的问题可能是你的 `site.py` 文件无效,可能是由于某种原因,或者更有可能的是,你没有获取到正确的 `site.py` 文件(它应该位于 `/usr/lib/python2.7/` 下)。在这种情况下,查看here以回顾 Python 用来查找该文件的所有目录,并检查你的环境是否正确。

增加解释器的冗长度对于解决这个问题有很大帮助。即使经过了这一切,我尝试将2.7版本的dist-package简单地符号链接到我的usr/local 3.x版本的dist-package,虽然进展了一点,但并不多。
 sudo ln -s /usr/lib/python2.7/dist-packages/gi/ /usr/local/lib/python3.2/dist-packages
~$ python3 Python 3.2.2+ (default, Feb 16 2012, 19:05:44) [GCC 4.6.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import gi Traceback (most recent call last): File "", line 1, in File "/usr/local/lib/python3.2/dist-packages/gi/__init__.py", line 23, in from ._gi import _API, Repository ImportError: /usr/lib/libpyglib-gi-2.0-python2.7.so.0: undefined symbol: _Py_ZeroStruct

如果你能找到那个丢失的符号,你可能能够解决这个问题。这是导致我走到这一步的冗长导入输出。此外,这似乎与之相关:http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=645963,祝你好运。

>>> 导入 gi # 尝试 gi.cpython-32mu.so # 尝试 gimodule.cpython-32mu.so # 尝试 gi.abi3.so # 尝试 gimodule.abi3.so # 尝试 gi.so # 尝试 gimodule.so # 尝试 gi.py # 尝试 gi.pyc # 尝试 /usr/lib/python3.2/gi.cpython-32mu.so # 尝试 /usr/lib/python3.2/gimodule.cpython-32mu.so # 尝试 /usr/lib/python3.2/gi.abi3.so # 尝试 /usr/lib/python3.2/gimodule.abi3.so # 尝试 /usr/lib/python3.2/gi.so # 尝试 /usr/lib/python3.2/gimodule.so # 尝试 /usr/lib/python3.2/gi.py # 尝试 /usr/lib/python3.2/gi.pyc # 尝试 /usr/lib/python3.2/plat-linux2/gi.cpython-32mu.so # 尝试 /usr/lib/python3.2/plat-linux2/gimodule.cpython-32mu.so # 尝试 /usr/lib/python3.2/plat-linux2/gi.abi3.so # 尝试 /usr/lib/python3.2/plat-linux2/gimodule.abi3.so # 尝试 /usr/lib/python3.2/plat-linux2/gi.so # 尝试 /usr/lib/python3.2/plat-linux2/gimodule.so # 尝试 /usr/lib/python3.2/plat-linux2/gi.py # 尝试 /usr/lib/python3.2/plat-linux2/gi.pyc # 尝试 /usr/lib/python3.2/lib-dynload/gi.cpython-32mu.so # 尝试 /usr/lib/python3.2/lib-dynload/gimodule.cpython-32mu.so # 尝试 /usr/lib/python3.2/lib-dynload/gi.abi3.so # 尝试 /usr/lib/python3.2/lib-dynload/gimodule.abi3.so # 尝试 /usr/lib/python3.2/lib-dynload/gi.so # 尝试 /usr/lib/python3.2/lib-dynload/gimodule.so # 尝试 /usr/lib/python3.2/lib-dynload/gi.py # 尝试 /usr/lib/python3.2/lib-dynload/gi.pyc # 尝试 /usr/local/lib/python3.2/dist-packages/gi.cpython-32mu.so # 尝试 /usr/local/lib/python3.2/dist-packages/gimodule.cpython-32mu.so # 尝试 /usr/local/lib/python3.2/dist-packages/gi.abi3.so # 尝试 /usr/local/lib/python3.2/dist-packages/gimodule.abi3.so # 尝试 /usr/local/lib/python3.2/dist-packages/gi.so # 尝试 /usr/local/lib/python3.2/dist-packages/gimodule.so # 尝试 /usr/local/lib/python3.2/dist-packages/gi.py # 尝试 /usr/local/lib/python3.2/dist-packages/gi.pyc # 尝试 /usr/lib/python3/dist-packages/gi.cpython-32mu.so # 尝试 /usr/lib/python3/dist-packages/gimodule.cpython-32mu.so # 尝试 /usr/lib/python3/dist-packages/gi.abi3.so # 尝试 /usr/lib/python3/dist-packages/gimodule.abi3.so # 尝试 /usr/lib/python3/dist-packages/gi.so # 尝试 /usr/lib/python3/dist-packages/gimodule.so # 尝试 /usr/lib/python3/dist-packages/gi.py # 尝试 /usr/lib/python3/dist-packages/gi.pyc Traceback (most recent call last): File "", line 1, in ImportError: 没有名为 gi 的模块
搜索路径甚至连python2.7的路径都没有考虑。 以下是从成功的python2.7视角看到的情况。
>>> import gi
# trying gi.so
# trying gimodule.so
# trying gi.py
# trying gi.pyc
# trying /usr/lib/python2.7/gi.so
# trying /usr/lib/python2.7/gimodule.so
# trying /usr/lib/python2.7/gi.py
# trying /usr/lib/python2.7/gi.pyc
# trying /usr/lib/python2.7/plat-linux2/gi.so
# trying /usr/lib/python2.7/plat-linux2/gimodule.so
# trying /usr/lib/python2.7/plat-linux2/gi.py
# trying /usr/lib/python2.7/plat-linux2/gi.pyc
# trying /usr/lib/python2.7/lib-tk/gi.so
# trying /usr/lib/python2.7/lib-tk/gimodule.so
# trying /usr/lib/python2.7/lib-tk/gi.py
# trying /usr/lib/python2.7/lib-tk/gi.pyc
# trying /usr/lib/python2.7/lib-dynload/gi.so
# trying /usr/lib/python2.7/lib-dynload/gimodule.so
# trying /usr/lib/python2.7/lib-dynload/gi.py
# trying /usr/lib/python2.7/lib-dynload/gi.pyc
# trying /usr/local/lib/python2.7/dist-packages/gi.so
# trying /usr/local/lib/python2.7/dist-packages/gimodule.so
# trying /usr/local/lib/python2.7/dist-packages/gi.py
# trying /usr/local/lib/python2.7/dist-packages/gi.pyc
import gi # directory /usr/lib/python2.7/dist-packages/gi
# trying /usr/lib/python2.7/dist-packages/gi/__init__.so
# trying /usr/lib/python2.7/dist-packages/gi/__init__module.so
# trying /usr/lib/python2.7/dist-packages/gi/__init__.py
# /usr/lib/python2.7/dist-packages/gi/__init__.pyc matches /usr/lib/python2.7/dist-packages/gi/__init__.py
import gi # precompiled from /usr/lib/python2.7/dist-packages/gi/__init__.pyc
# trying __future__.so
# trying __future__module.so
# trying __future__.py
# trying __future__.pyc
# trying /usr/lib/python2.7/__future__.so
# trying /usr/lib/python2.7/__future__module.so
# trying /usr/lib/python2.7/__future__.py
# /usr/lib/python2.7/__future__.pyc matches /usr/lib/python2.7/__future__.py
import __future__ # precompiled from /usr/lib/python2.7/__future__.pyc
# trying /usr/lib/python2.7/dist-packages/gi/_gi.so
dlopen("/usr/lib/python2.7/dist-packages/gi/_gi.so", 2);
import gi._gobject # directory /usr/lib/python2.7/dist-packages/gi/_gobject
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/__init__.so
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/__init__module.so
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/__init__.py
# /usr/lib/python2.7/dist-packages/gi/_gobject/__init__.pyc matches /usr/lib/python2.7/dist-packages/gi/_gobject/__init__.py
import gi._gobject # precompiled from /usr/lib/python2.7/dist-packages/gi/_gobject/__init__.pyc
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/sys.so
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/sysmodule.so
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/sys.py
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/sys.pyc
import gi._glib # directory /usr/lib/python2.7/dist-packages/gi/_glib
# trying /usr/lib/python2.7/dist-packages/gi/_glib/__init__.so
# trying /usr/lib/python2.7/dist-packages/gi/_glib/__init__module.so
# trying /usr/lib/python2.7/dist-packages/gi/_glib/__init__.py
# /usr/lib/python2.7/dist-packages/gi/_glib/__init__.pyc matches /usr/lib/python2.7/dist-packages/gi/_glib/__init__.py
import gi._glib # precompiled from /usr/lib/python2.7/dist-packages/gi/_glib/__init__.pyc
# trying /usr/lib/python2.7/dist-packages/gi/_glib/_glib.so
dlopen("/usr/lib/python2.7/dist-packages/gi/_glib/_glib.so", 2);
import gi._glib._glib # dynamically loaded from /usr/lib/python2.7/dist-packages/gi/_glib/_glib.so
# trying /usr/lib/python2.7/dist-packages/gi/_glib/option.so
# trying /usr/lib/python2.7/dist-packages/gi/_glib/optionmodule.so
# trying /usr/lib/python2.7/dist-packages/gi/_glib/option.py
# /usr/lib/python2.7/dist-packages/gi/_glib/option.pyc matches /usr/lib/python2.7/dist-packages/gi/_glib/option.py
import gi._glib.option # precompiled from /usr/lib/python2.7/dist-packages/gi/_glib/option.pyc
# trying /usr/lib/python2.7/dist-packages/gi/_glib/sys.so
# trying /usr/lib/python2.7/dist-packages/gi/_glib/sysmodule.so
# trying /usr/lib/python2.7/dist-packages/gi/_glib/sys.py
# trying /usr/lib/python2.7/dist-packages/gi/_glib/sys.pyc
# trying /usr/lib/python2.7/dist-packages/gi/_glib/optparse.so
# trying /usr/lib/python2.7/dist-packages/gi/_glib/optparsemodule.so
# trying /usr/lib/python2.7/dist-packages/gi/_glib/optparse.py
# trying /usr/lib/python2.7/dist-packages/gi/_glib/optparse.pyc
# trying optparse.so
# trying optparsemodule.so
# trying optparse.py
# trying optparse.pyc
# trying /usr/lib/python2.7/optparse.so
# trying /usr/lib/python2.7/optparsemodule.so
# trying /usr/lib/python2.7/optparse.py
# /usr/lib/python2.7/optparse.pyc matches /usr/lib/python2.7/optparse.py
import optparse # precompiled from /usr/lib/python2.7/optparse.pyc
# trying textwrap.so
# trying textwrapmodule.so
# trying textwrap.py
# trying textwrap.pyc
# trying /usr/lib/python2.7/textwrap.so
# trying /usr/lib/python2.7/textwrapmodule.so
# trying /usr/lib/python2.7/textwrap.py
# /usr/lib/python2.7/textwrap.pyc matches /usr/lib/python2.7/textwrap.py
import textwrap # precompiled from /usr/lib/python2.7/textwrap.pyc
# trying string.so
# trying stringmodule.so
# trying string.py
# trying string.pyc
# trying /usr/lib/python2.7/string.so
# trying /usr/lib/python2.7/stringmodule.so
# trying /usr/lib/python2.7/string.py
# /usr/lib/python2.7/string.pyc matches /usr/lib/python2.7/string.py
import string # precompiled from /usr/lib/python2.7/string.pyc
import strop # builtin
# trying gettext.so
# trying gettextmodule.so
# trying gettext.py
# trying gettext.pyc
# trying /usr/lib/python2.7/gettext.so
# trying /usr/lib/python2.7/gettextmodule.so
# trying /usr/lib/python2.7/gettext.py
# /usr/lib/python2.7/gettext.pyc matches /usr/lib/python2.7/gettext.py
import gettext # precompiled from /usr/lib/python2.7/gettext.pyc
# trying locale.so
# trying localemodule.so
# trying locale.py
# trying locale.pyc
# trying /usr/lib/python2.7/locale.so
# trying /usr/lib/python2.7/localemodule.so
# trying /usr/lib/python2.7/locale.py
# /usr/lib/python2.7/locale.pyc matches /usr/lib/python2.7/locale.py
import locale # precompiled from /usr/lib/python2.7/locale.pyc
import operator # builtin
# trying functools.so
# trying functoolsmodule.so
# trying functools.py
# trying functools.pyc
# trying /usr/lib/python2.7/functools.so
# trying /usr/lib/python2.7/functoolsmodule.so
# trying /usr/lib/python2.7/functools.py
# /usr/lib/python2.7/functools.pyc matches /usr/lib/python2.7/functools.py
import functools # precompiled from /usr/lib/python2.7/functools.pyc
import _functools # builtin
import _locale # builtin
# trying copy.so
# trying copymodule.so
# trying copy.py
# trying copy.pyc
# trying /usr/lib/python2.7/copy.so
# trying /usr/lib/python2.7/copymodule.so
# trying /usr/lib/python2.7/copy.py
# /usr/lib/python2.7/copy.pyc matches /usr/lib/python2.7/copy.py
import copy # precompiled from /usr/lib/python2.7/copy.pyc
# trying weakref.so
# trying weakrefmodule.so
# trying weakref.py
# trying weakref.pyc
# trying /usr/lib/python2.7/weakref.so
# trying /usr/lib/python2.7/weakrefmodule.so
# trying /usr/lib/python2.7/weakref.py
# /usr/lib/python2.7/weakref.pyc matches /usr/lib/python2.7/weakref.py
import weakref # precompiled from /usr/lib/python2.7/weakref.pyc
# trying org.so
# trying orgmodule.so
# trying org.py
# trying org.pyc
# trying /usr/lib/python2.7/org.so
# trying /usr/lib/python2.7/orgmodule.so
# trying /usr/lib/python2.7/org.py
# trying /usr/lib/python2.7/org.pyc
# trying /usr/lib/python2.7/plat-linux2/org.so
# trying /usr/lib/python2.7/plat-linux2/orgmodule.so
# trying /usr/lib/python2.7/plat-linux2/org.py
# trying /usr/lib/python2.7/plat-linux2/org.pyc
# trying /usr/lib/python2.7/lib-tk/org.so
# trying /usr/lib/python2.7/lib-tk/orgmodule.so
# trying /usr/lib/python2.7/lib-tk/org.py
# trying /usr/lib/python2.7/lib-tk/org.pyc
# trying /usr/lib/python2.7/lib-dynload/org.so
# trying /usr/lib/python2.7/lib-dynload/orgmodule.so
# trying /usr/lib/python2.7/lib-dynload/org.py
# trying /usr/lib/python2.7/lib-dynload/org.pyc
# trying /usr/local/lib/python2.7/dist-packages/org.so
# trying /usr/local/lib/python2.7/dist-packages/orgmodule.so
# trying /usr/local/lib/python2.7/dist-packages/org.py
# trying /usr/local/lib/python2.7/dist-packages/org.pyc
# trying /usr/lib/python2.7/dist-packages/org.so
# trying /usr/lib/python2.7/dist-packages/orgmodule.so
# trying /usr/lib/python2.7/dist-packages/org.py
# trying /usr/lib/python2.7/dist-packages/org.pyc
# trying /usr/lib/python2.7/dist-packages/PIL/org.so
# trying /usr/lib/python2.7/dist-packages/PIL/orgmodule.so
# trying /usr/lib/python2.7/dist-packages/PIL/org.py
# trying /usr/lib/python2.7/dist-packages/PIL/org.pyc
# trying /usr/lib/python2.7/dist-packages/gst-0.10/org.so
# trying /usr/lib/python2.7/dist-packages/gst-0.10/orgmodule.so
# trying /usr/lib/python2.7/dist-packages/gst-0.10/org.py
# trying /usr/lib/python2.7/dist-packages/gst-0.10/org.pyc
# trying /usr/lib/python2.7/dist-packages/gtk-2.0/org.so
# trying /usr/lib/python2.7/dist-packages/gtk-2.0/orgmodule.so
# trying /usr/lib/python2.7/dist-packages/gtk-2.0/org.py
# trying /usr/lib/python2.7/dist-packages/gtk-2.0/org.pyc
# trying /usr/lib/pymodules/python2.7/org.so
# trying /usr/lib/pymodules/python2.7/orgmodule.so
# trying /usr/lib/pymodules/python2.7/org.py
# trying /usr/lib/pymodules/python2.7/org.pyc
# trying /usr/lib/python2.7/dist-packages/ubuntu-sso-client/org.so
# trying /usr/lib/python2.7/dist-packages/ubuntu-sso-client/orgmodule.so
# trying /usr/lib/python2.7/dist-packages/ubuntu-sso-client/org.py
# trying /usr/lib/python2.7/dist-packages/ubuntu-sso-client/org.pyc
# trying /usr/lib/python2.7/dist-packages/ubuntuone-client/org.so
# trying /usr/lib/python2.7/dist-packages/ubuntuone-client/orgmodule.so
# trying /usr/lib/python2.7/dist-packages/ubuntuone-client/org.py
# trying /usr/lib/python2.7/dist-packages/ubuntuone-client/org.pyc
# trying /usr/lib/python2.7/dist-packages/ubuntuone-control-panel/org.so
# trying /usr/lib/python2.7/dist-packages/ubuntuone-control-panel/orgmodule.so
# trying /usr/lib/python2.7/dist-packages/ubuntuone-control-panel/org.py
# trying /usr/lib/python2.7/dist-packages/ubuntuone-control-panel/org.pyc
# trying /usr/lib/python2.7/dist-packages/ubuntuone-couch/org.so
# trying /usr/lib/python2.7/dist-packages/ubuntuone-couch/orgmodule.so
# trying /usr/lib/python2.7/dist-packages/ubuntuone-couch/org.py
# trying /usr/lib/python2.7/dist-packages/ubuntuone-couch/org.pyc
# trying /usr/lib/python2.7/dist-packages/ubuntuone-installer/org.so
# trying /usr/lib/python2.7/dist-packages/ubuntuone-installer/orgmodule.so
# trying /usr/lib/python2.7/dist-packages/ubuntuone-installer/org.py
# trying /usr/lib/python2.7/dist-packages/ubuntuone-installer/org.pyc
# trying /usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol/org.so
# trying /usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol/orgmodule.so
# trying /usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol/org.py
# trying /usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol/org.pyc
# trying struct.so
# trying structmodule.so
# trying struct.py
# trying struct.pyc
# trying /usr/lib/python2.7/struct.so
# trying /usr/lib/python2.7/structmodule.so
# trying /usr/lib/python2.7/struct.py
# /usr/lib/python2.7/struct.pyc matches /usr/lib/python2.7/struct.py
import struct # precompiled from /usr/lib/python2.7/struct.pyc
import _struct # builtin
# trying /usr/lib/python2.7/dist-packages/gi/_glib/gi.so
# trying /usr/lib/python2.7/dist-packages/gi/_glib/gimodule.so
# trying /usr/lib/python2.7/dist-packages/gi/_glib/gi.py
# trying /usr/lib/python2.7/dist-packages/gi/_glib/gi.pyc
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/constants.so
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/constantsmodule.so
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/constants.py
# /usr/lib/python2.7/dist-packages/gi/_gobject/constants.pyc matches /usr/lib/python2.7/dist-packages/gi/_gobject/constants.py
import gi._gobject.constants # precompiled from /usr/lib/python2.7/dist-packages/gi/_gobject/constants.pyc
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/_gobject.so
dlopen("/usr/lib/python2.7/dist-packages/gi/_gobject/_gobject.so", 2);
import gi._gobject._gobject # dynamically loaded from /usr/lib/python2.7/dist-packages/gi/_gobject/_gobject.so
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/propertyhelper.so
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/propertyhelpermodule.so
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/propertyhelper.py
# /usr/lib/python2.7/dist-packages/gi/_gobject/propertyhelper.pyc matches /usr/lib/python2.7/dist-packages/gi/_gobject/propertyhelper.py
import gi._gobject.propertyhelper # precompiled from /usr/lib/python2.7/dist-packages/gi/_gobject/propertyhelper.pyc
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/GTypeWrapper.so
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/GTypeWrappermodule.so
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/GTypeWrapper.py
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/GTypeWrapper.pyc
# trying datetime.so
# trying datetimemodule.so
# trying datetime.py
# trying datetime.pyc
# trying /usr/lib/python2.7/datetime.so
# trying /usr/lib/python2.7/datetimemodule.so
# trying /usr/lib/python2.7/datetime.py
# trying /usr/lib/python2.7/datetime.pyc
# trying /usr/lib/python2.7/plat-linux2/datetime.so
# trying /usr/lib/python2.7/plat-linux2/datetimemodule.so
# trying /usr/lib/python2.7/plat-linux2/datetime.py
# trying /usr/lib/python2.7/plat-linux2/datetime.pyc
# trying /usr/lib/python2.7/lib-tk/datetime.so
# trying /usr/lib/python2.7/lib-tk/datetimemodule.so
# trying /usr/lib/python2.7/lib-tk/datetime.py
# trying /usr/lib/python2.7/lib-tk/datetime.pyc
# trying /usr/lib/python2.7/lib-dynload/datetime.so
dlopen("/usr/lib/python2.7/lib-dynload/datetime.so", 2);
import datetime # dynamically loaded from /usr/lib/python2.7/lib-dynload/datetime.so
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/GTypeWrapper.so
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/GTypeWrappermodule.so
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/GTypeWrapper.py
# trying /usr/lib/python2.7/dist-packages/gi/_gobject/GTypeWrapper.pyc
import gi._gi # dynamically loaded from /usr/lib/python2.7/dist-packages/gi/_gi.so

在Python环境中,一切都与依赖关系有关,就像在C语言中一样。但是,如果你通过PyPI(pip)或系统打包工具(apt、yum、brew等)安装模块,这将影响所有Python脚本的进一步调用方式。 例如,安装PyGObject
A.(选择其中一个)通过软件包工具(在某些情况下可能无法正常工作,apt可能被禁用或Python版本发生变化):
    sudo apt install python3-gi python3-gi-cairo gir1.2-gtk-3.0

或者B.(选择其中一个)通过PyPi(这应该总是有效的)
    cat <<EOF | tee requirements.txt
    pycairo
    PyGObject
    EOF
    pip3 install -r requirements.txt 

A. Python库通过常见的软件包工具进行安装,如果不使用标准的python3-软件包,进一步更新将会破坏依赖系统。
    python3
    >>> import gi.repository

B.(推荐给开发者)Python模块可能会安装在虚拟环境中(virtualenv create /usr/src/venv)。因此,它将在启用了virtualenv的shell块中找到:
    source /usr/src/venv/bin/activate
    pip3 install -r requirements.txt
    python3
    >>> import gi.repository

requirements.txt 包含了你想要添加到 PYTHONPATH 的 Python 模块列表。 virtualenv 确保每个所需的模块都可以从所需的 Python 版本和库中使用,并且优先于系统软件包工具管理器。

在我的情况下,我一直使用的是Python3.6,最近升级到了Python3.7,然后出现了这个问题。以下解决方案适用于我:
cd /usr/lib/python3/dist-packages/gi
sudo ln -s _gi.cpython-{36m,37m}-x86_64-linux-gnu.so

这个方法在Ubuntu 20.04、Python 3.8和虚拟环境下对我有效。

为了方便起见,我引用如下:

..但是我意识到我的Python版本是3.6,而gi安装在Python 3目录下,因为我是通过这个命令"sudo apt-get install python3-gi"来安装的,所以我在终端上运行了这个命令:

ln -s /usr/lib/python3/dist-packages/gi /home/your_name_goes_here/miniconda3/lib/python3.6/site-packages/

(附注:在"your_user_goes_here"中,你要填入你的用户名)

实际上,为了正确性(因为我不使用conda),我修改了这个命令为:

$ ln -s /usr/lib/python3/dist-packages/gi /home/your_name_goes_here/your_python_path/3.8/lib/python3.8/site-packages