ターミナルが動かなくなりました。それも突然。身に覚えのない理不尽な仕打ちですが、不思議と全くイライラしないのがLinuxの不思議なところですね。おそらく坊主が好きだと袈裟まで好きになる現象だと思います。

なお環境は以下です。

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 16.04.6 LTS
Release:	16.04
Codename:	xenial

そもそもターミナルってなに?

どうやら今までターミナルだと思っていたものはgnome-terminal という機能だったようです。朝起きたらとりあえず <CTRT> <ALT> t で無意識に立ち上げていたので全く知りませんでした。話を戻しますが、このターミナルが動かなくなって一番こまったことはターミナルをターミナル上で起動できないことでした。というのも、一度動かせればプロセスを確認できるのですが、そもそもターミナルが動かないので詰んでる感がありました。そこで色々と見てみたところ、gnome-terminal という機能を今まで使っていたことに気づきました。

ちなみにターミナルはgnome-terminal 以外にも色々とあって、fishとかxtermとかあります。今回命拾いしたのも xterm があったからですね。僕はとにかく黒い画面を見て安心したかったので、xtermを探して起動しました。そこでxterm上で gnome-terminal と入力すると、見慣れない下のエラー文に遭遇したわけです。

ImportError: cannot import name '_gi'

原因と直し方

このエラー文が意味するところは文字通り_gi を import できないよー、というところなのです。で、このエラーをぐぐってみたところ、どうやらエラーの原因は「terminalが要求するPythonのバージョン」と「ユーザーが設定しているPythonのバージョン」のコンフリクトでした。というのも、UbuntuのPythonは2.7と3.5がデフォルトだったのですが、先日3.6にしたため喧嘩してしまったようです。

直し方には少なくとも2つ手段があります。1つは /usr/bin/gnome-terminal の先頭に以下の行を追加してあげます。

#!/usr/bin/python3.5

これで明示的に「pythonは3.5を使いますよー」と教えてあげられます。ただ、たぶん sudo で実行せねばならないので、sudo vim /usr/bin/gnome-terminal のようなコマンドが必要になると思います。

もう1つはGnome terminal will not startで見かけた解決法なのですが、シンボリックリンクを貼り直す、という手法もあるようです。自分で検証していないのでここでは詳しく説明しませんが、あくまでも情報として。

まとめ

今回はターミナルが動かなる原因の例として、デフォルトのPythonを変えてしまった事例を共有しました。また、その解決方法としてファイルを書き換える方法と、シンボリックリンクを貼り直す方法を紹介しました。とにかく、エラーログを読むのが大切ということですね。

余談ですが、今回助かったのはxtermがあったからなのですが、もともとterminalしかない Windows Subsystem for Linuxだとどうなるのかなぁ、とか気になっています。もしかして即死でしょうか。(試さないでください)