ターミナルが動かなくなりました。それも突然。 身に覚えのない理不尽な仕打ちですが、 不思議と全くイライラしないのが 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'

原因と直し方

このエラー文が意味するところは文字通り _giimport できないよー、というところなのです。 で、このエラーをぐぐってみたところ、 どうやらエラーの原因は 「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 だとどうなるのかなぁ、とか気になっています。 もしかして即死でしょうか。 (試さないでください)