Gnome终端无法启动。

我刚刚尝试在我的Ubuntu 16.04系统上安装Python 3.6,现在无法从启动器或通过Ctrl + Alt + T运行终端。我尝试从XTerm中运行gnome-terminal,并收到以下消息:
Traceback (most recent call last):
  File "/usr/bin/gnome-terminal", line 9, in <module>
    from gi.repository import GLib, Gio
  File "/usr/lib/python3/dist-packages/gi/__init__.py", line 42, in <module>
    from . import _gi
ImportError: cannot import name '_gi'
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
    from apport.fileutils import likely_packaged, get_recent_crashes
  File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
    from apport.report import Report
  File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
    import apport.fileutils
  File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
    from apport.packaging_impl import impl as packaging
  File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 23, in <module>
    import apt
  File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'

Original exception was:
Traceback (most recent call last):
  File "/usr/bin/gnome-terminal", line 9, in <module>
    from gi.repository import GLib, Gio
  File "/usr/lib/python3/dist-packages/gi/__init__.py", line 42, in <module>
    from . import _gi
ImportError: cannot import name '_gi'

我该如何修复这个错误?

还应该注意以下事项:

  • 我的gnome-terminal文件现在是一个Python脚本。
  • gnome-terminal.real文件将按预期打开终端。
  • python3.5 gnome-terminal将按预期打开终端。
7个回答

可能符号链接 /usr/bin/python3 指向了 python3.6,这是不应该的。通过运行以下命令来修复它:
sudo rm /usr/bin/python3
sudo ln -s python3.5 /usr/bin/python3

5此外,这是由于python3-apt软件包中的一个错误引起的;关于此问题在Launchpad上有一个已经开放的bug报告链接 - ash
应该在哪个路径上创建符号链接?直到终端的错误修复,pyenv是一个更好的选择吗? - josircg
@josircg:不太确定我理解你的路径问题。符号链接和可执行文件都位于/usr/bin目录下。可能还有更好的替代方案。如果你知道任何其他的,请写下你自己的答案。 - Gunnar Hjalmarsson
关于路径:我认为在 ln 前面加上 cd /usr/bin 是明智的,对吗? - josircg
关于解决方案:如果您尝试重新启用Python 3.6,您将需要再次删除/重新创建符号链接。这也应该在解决方案中进行注明。 - josircg
@josircg:在这种情况下,cd'ing并不是必需的。结果将是相同的。不确定我是否看到您建议的说明的价值。问题是针对Ubuntu版本(16.04)提出的,该版本基于python3.5。只要您使用的是16.04,符号链接不应指向任何其他python版本。如果/当您升级,它将自动修复。 - Gunnar Hjalmarsson
1@GunnarHjalmarsson 我在哪里可以运行这些命令?我的终端无法打开。 - Shoyeb Sheikh
1@ShoyebSheikh: 也许你有 XTerm? - Gunnar Hjalmarsson
@GunnarHjalmarsson 搞定了,非常感谢。https://askubuntu.com/questions/1132349/terminal-not-opening-up-after-upgrading-python-to-3-7 - Shoyeb Sheikh

你不需要将Python3指向python3.5,只需运行以下命令即可:
cd /usr/lib/python3/dist-packages/gi/
sudo cp _gi.cpython-35m-x86_64-linux-gnu.so _gi.cpython-36m-x86_64-linux-gnu.so
sudo cp _gi_cairo.cpython-35m-x86_64-linux-gnu.so _gi_cairo.cpython-36m-x86_64-linux-gnu.so

1这个到底是做什么的?它安全吗? - wjandrea
5这应该是答案。@wjandrea,它很安全,我在Ubuntu 18下使用Python 3.7没有任何问题。 - Huan
你能将这些粘贴到xterm吗? - Tahlor
可以,这应该是答案,我也支持@Huan的看法。 - user1282043
2这个的解释仍然会很有帮助。 - Daniel Holmes
对我来说,并没有解决所有问题。例如,终端被修复了,但打印机和软件更新程序仍无法启动。根据下面的另一个答案,我需要切换回3.5版本,这确实解决了所有问题。 - davidbak
1正如@saeed在下面的回答中提到的那样,这涉及将C共享库从Python 3.5复制到Python 3.6,这可能会在使用Python进行其他用途时引起问题。 - webelo
1我发现了45个文件,它们的文件名中包含先前版本的37,命令是find /usr/lib/python3/dist-packages | grep 37 | grep -v pyc | wc。所以,gi/目录下的文件可能不是你需要复制的唯一文件。 - user677955
不需要第三行 - Alvaro
急需解释,评论表明这并不那么简单。 - Caleb Stanford
这对我在Ubuntu 16.04上有效,特别感谢! - Edouard Thiel

适当更改默认的Python3的方法如下:
sudo update-alternatives --config python3

尽管将 _gi_cairo.cpython-35m-x86_64-linux-gnu.sopython3.5 复制到 python3.6 可以解决问题,但这样做会破坏你的库的一致性,因此应该避免。

@davidbak 抱怨Ubuntu的正确地方是在Ubuntu IRC或邮件列表上(或向他们的存储库提交补丁),在stackoverflow上你只是在虚空中呐喊。 - Boris Verkhovskiy

我知道这是一个老问题,但对于那些寻找除了全局更改python3为python 3.5之外的其他方法的人来说,你可以将/usr/bin/gnome-terminal的第一行从#! /usr/bin/python3更改为#! /usr/bin/python3.5
注意:我的电脑上没有python 3.5,但在python 3.6中import gi可以工作,所以我使用了3.6而不是3.5。

5gnome-terminalжҳҜе”ҜдёҖеҮәй—®йўҳзҡ„еҗ—пјҹиҝҳжңүе…¶д»–gnome-*зҡ„дёңиҘҝжҲ‘д№ҹйңҖиҰҒж”№еҸҳеҗ—пјҹ - user677955

真正的原因+解决方案 - Python3.7 Gnome 终端出现问题 - Ubuntu Linux Mint

这个问题在另一个帖子中从未得到回答 升级到Python 3.7后终端无法打开,所以我提供了原因和解决方案。

安装Python 3.7是正确的选择,但缺少PyGObject gi会导致Gnome终端在启动时失败,修复很简单

  • sudo apt update && sudo apt upgrade && sudo apt autoremove
  • sudo apt install python3.7 python3.7-dev ffmpeg
  • sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1
  • sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2
  • sudo update-alternatives --config python3 # 选择3.7版本
  • python3 -V # 应该是3.7.5或更高版本
  • 此处不要重新启动,否则gnome终端将崩溃。

新手解决方法:在Linux高级恢复模式下操作(所以不要重新启动)

  • $ 不要执行sudo update-alternatives --config python3 # 选择3.6版本 这样可以恢复终端,但不是解决方案。

解释:- [https://pygobject.readthedocs.io/en/latest/getting_started.html#ubuntu-getting-started][1]

解决方案只需安装缺失的内容。

  • python3 -V # 必须是 Python 3.7

  • mkdir -p ~/.local/bin ; cd .local/bin

  • vi hello.py # 使用 nano 或任何编辑器 - 这是一个测试程序。请参考末尾的链接。

        # 测试脚本
        import gi
        gi.require_version("Gtk", "3.0")
        from gi.repository import Gtk
    
        window = Gtk.Window(title="Hello World")
        window.show()
        window.connect("destroy", Gtk.main_quit)
        Gtk.main()
    
  • sudo update-alternatives --config python3 # 设置 Python 3.7

  • python3 hello.py # 它不起作用,所以安装一些东西...

  • sudo apt install python3-gi python3-gi-cairo gir1.2-gtk-3.0

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

  • python3 hello.py # 可能仍然不起作用,安装更多东西

如果你使用pip install来解决问题,请注意它只会为当前用户安装。
对于其他Linux或非pip安装,请使用末尾的链接。

  • sudo -k # 注意,pip不是安全可信任的,关闭sudo!
  • python3 -m pip install -U pycairo # 这将自动使用pip3
  • python3 -m pip install -U PyGObject # 这解决了问题!
  • python3 hello.py # 可以工作!请注意,其他用户必须安装相同的内容!
  • sudo shutdown -r now # 现在可以重新启动了。Gnome终端将正常工作。
  • 注意:我的pip样式中,python3实际上调用的是pip3而不是pip。
  • 这是因为Ubuntu或Linux Mint:/usr/bin/gnome-terminal调用默认的python3,即3.7,并发现你的gi PyGObject包缺失,导致终端无法使用,每个用户都无法访问控制面板。
结论,你可以保留你的Python升级。
参考文献: [1]: 包括gi测试的PyGObject https://pygobject.readthedocs.io/en/latest/getting_started.html#ubuntu-getting-started

我根据上面的解决方案修复了gnome-terminal的问题。
输入以下命令:
cd /usr/lib/python3/dist-packages/gi/
sudo cp _gi.cpython-36m-x86_64-linux-gnu.so _gi.cpython-37m-x86_64-linux-gnu.so
sudo cp _gi_cairo.cpython-35m-x86_64-linux-gnu.so _gi_cairo.cpython-36m-x86_64-linux-gnu.so

如果你正在使用Ubuntu 22.04,这里有一个非常简单的解决方案。/usr/bin/gnome-terminal是一个Python脚本。 你可以将第一行的#!/usb/bin/python改为#!/usr/bin/python3.8。
 #!/usr/bin/python3.8

 import string
 import subprocess
 import sys
 import random

 from argparse import ArgumentParser, SUPPRESS
 from gi.repository import GLib, Gio
 ...

  • 相关问题