◀ 5.

【yumエラー】File "/usr/bin/yum", line 30 except KeyboardInterrupt, e:

▶
この記事の要点
  • CentOS 7 などで yum を実行すると File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: と SyntaxError が出るエラー
  • 原因: /usr/bin/python を Python 3 に向けた。yum は Python 2 で書かれており、Python 3 では文法エラーになる
  • 対処: sudo ln -sf python2 /usr/bin/python で Python 2 に戻す
  • yum が直っても urlgrabber-ext-down で同じ種類のエラーが出ることがある。こちらも Python 2 を使うように直す
  • Python 3 を使いたいときは /usr/bin/python を書き換えず、python3 コマンドや仮想環境を使う
  • CentOS 7 は 2024 年 6 月にサポート終了。可能なら後継 OS への移行を検討する

エラー内容

  File "/usr/bin/yum", line 30
    except KeyboardInterrupt, e:
                            ^
SyntaxError: invalid syntax

発生条件

yum コマンドを実行した際に発生するエラーです。/usr/bin 直下にある python のシンボリックリンクを 2.x 系から 3.x 系に変更すると発生します。典型的には、Python 3 をインストールしたあとに「python と打ったら Python 3 が動くようにしたい」と考えて、次のような操作をした場合です。

# これが原因になる操作
sudo ln -sf /usr/bin/python3 /usr/bin/python

原因:yum は Python 2 で書かれている

CentOS 7(RHEL 7 系)の yum は Python で書かれたスクリプトで、1 行目(shebang)が #!/usr/bin/python になっています。つまり、/usr/bin/python が指している Python で実行されます。

エラーになった 30 行目の except KeyboardInterrupt, e: は Python 2 の例外の書き方で、Python 3 では except KeyboardInterrupt as e: と書かなければ文法エラーになります。そのため、/usr/bin/python を Python 3 に向けた時点で yum が動かなくなります。

yum 以外にも、CentOS 7 には /usr/bin/python を前提にした Python 2 製のシステムツール(firewall-cmd など)があり、同じ理由で動かなくなることがあります。

対処法

1. /usr/bin/python を Python 2 に戻す(推奨)

2.x 系に戻すとエラーが解決します。

# 現在のリンク先を確認
ls -l /usr/bin/python*

# Python 2 に戻す(CentOS 7 では python2 → python2.7 へのリンクがある)
sudo ln -sf python2 /usr/bin/python

# 確認
python -V      # Python 2.7.x と表示されれば OK
sudo yum --version

2. urlgrabber-ext-down でも同じエラーが出る場合

yum の起動は直ったのに、パッケージのダウンロード中に /usr/libexec/urlgrabber-ext-down で SyntaxError が出ることがあります。これも Python 2 で書かれたスクリプトです。手順 1 でリンクを戻していれば解消しますが、リンクを戻せない事情がある場合は、各スクリプトの 1 行目を python2 に明示します。

# バックアップを取ってから 1 行目を書き換える
sudo cp -p /usr/bin/yum /usr/bin/yum.bak
sudo cp -p /usr/libexec/urlgrabber-ext-down /usr/libexec/urlgrabber-ext-down.bak
sudo sed -i '1s|^#!/usr/bin/python$|#!/usr/bin/python2|' /usr/bin/yum /usr/libexec/urlgrabber-ext-down

head -1 /usr/bin/yum   # #!/usr/bin/python2 になっていることを確認

この方法は、yum のパッケージ更新でファイルが置き換わると元に戻ります。根本的には手順 1 の「/usr/bin/python は Python 2 のままにする」が確実です。

Python 3 を使いたいときの正しいやり方

システムの /usr/bin/python は書き換えず、次のいずれかの方法で Python 3 を使います。

方法やり方特徴
python3 コマンドを使うそのまま python3 / pip3 と打つ最も安全。システムに影響しない
仮想環境python3 -m venv venv → source venv/bin/activate有効化した端末では python が Python 3 になる。プロジェクトごとに分けられる
エイリアス~/.bashrc に alias python=python3対話シェルだけに効き、yum などのスクリプトには影響しない
pyenvユーザーのホームに任意のバージョンを入れて切り替える複数バージョンを使い分けたい場合

CentOS 8 以降・後継 OS との違い

  • CentOS 8 / RHEL 8 以降の yum は実体が dnf で、システム専用の Python 3(platform-python)で動くため、/usr/bin/python を変えてもこのエラーにはなりません
  • CentOS 7 は 2024 年 6 月 30 日にサポートが終了しており、標準のミラーからパッケージを取得できなくなっています。セキュリティ更新も提供されないため、AlmaLinux や Rocky Linux などへの移行を検討してください

確認方法

  1. ls -l /usr/bin/python でリンク先が python2(または python2.7)になっているか
  2. head -1 /usr/bin/yum で、yum がどの Python を使う設定か
  3. sudo yum check-update がエラーなく最後まで動くか(ダウンロード処理まで確認できる)

関連

Post Share
子ページ

子ページはありません

同階層のページ
  1. curl: (51) SSL: certificate subject name '~' does not match target host name '~'
  2. mount: special device ... does not exist
  3. 【yum install php-fpm】エラー: パッケージ: php-fpm-5.4.16-46.el7.x86_64 (base)
  4. ファイルが開けません: https://centos7.iuscommunity.org/ius-release.rpm を飛ばします。
  5. File "/usr/bin/yum", line 30 except KeyboardInterrupt, e:
  6. unable to execute 'gcc': No such file or directory