Python3環境で `pip install` したコマンドラインツールが動作しない場合の対処

Bash, Python

はじめに

先日投稿した以下のエントリにて、 「自分のMacBookPro環境をPython2からPython3環境にバージョンアップしたら正常に動作しない」 という問題が発生していたが、解消方法がわかったのでまとめてみました。

なんとか問題解決まで至りましたが、 Pythonに詳しいエンジニアならすぐにわかることなのでしょう 。Python素人がハマった内容を共有します。

検証環境

$ uname -moi
x86_64 MacBookPro10,1 Darwin

$ bash -version
GNU bash, バージョン 5.0.2(1)-release (x86_64-apple-darwin18.2.0)

調査開始

Pythonのバージョンを確認する

まず僕のMac環境のPythonのバージョンを確認します。

$ python --version
Python 3.7.2

エラーの内容を確認する

先日もお話したとおり、 bitbucket-clipython2系 環境では正常に動作していましたが、 python3系 環境では正しく動いていません。

$ bb help
Traceback (most recent call last):
  File "/usr/local/bin/bb", line 6, in <module>
    from bitbucket.cli import run
  File "/usr/local/lib/python3.7/site-packages/bitbucket/__init__.py", line 1, in <module>
    from .repositories import *
  File "/usr/local/lib/python3.7/site-packages/bitbucket/repositories.py", line 25
    print r.content
          ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(r.content)?

bb コマンドのスクリプトを確認する

ふと bb コマンドは一体どんなスクリプトなのだろうを思いコードを覗いてみました。

$ vi $(which bb)

すると、 Shellbang(シェバング) 部分に以下のような記述がありました。

#!/usr/local/opt/python/bin/python3.7
# -*- coding: utf-8 -*-
...

つまり、python3でこのスクリプトを動かしなさい、という設定が入っていたわけですね。

shellbangを変更したらどうなるか試してみる

試しにスクリプトを書き換えてみました。
※ごちゃごちゃ書いていますが、シェバング部分だけを python2 を利用するように変更しました。

# 空一時ファイルを作成
$ tmp=$(mktemp)

# シェバング部分をpython2系を利用して実行されるような記述に変更
$ echo '#!'$(which python2) >> $tmp

# もとのスクリプトの2行目以降を出力
$ sed -n '2,$p' $(which bb) >> $tmp

# 作成したファイルともとのスクリプトの差分を確認
$ diff $tmp $(which bb)
--- /var/folders/06/8fqfbwp956xf04ztsh43f21c0000gn/T/tmp.QOccpHpRBS     2019-03-09 14:56:20.000000000 +0900
+++ /usr/local/bin/bb   2019-03-09 14:49:24.000000000 +0900
@@ -1,4 +1,4 @@
-#!/usr/local/bin/python2
+#!/usr/local/opt/python/bin/python3.7
 # -*- coding: utf-8 -*-
 import re
 import sys

# 書き換え
$ cat $tmp > $(which bb)

その後 bb コマンドを実行してみます。

$ bb help
****************************************************
  Warning: config file is readable by other users.
  If you are storing your password in this file,
  it may not be secure
****************************************************
usage: bitbucket <command> [<args>]
bb: error: argument create
  update
  delete
  clone
  create_from_local
  pull_request
  pull
  download
  list
  privilege: invalid choice: 'help' (choose from 'create', 'update', 'delete', 'clone', 'pull', 'create_from_local', 'pull_request', 'download', 'list', 'privilege', 'group-privilege', 'add_remote')
$

正しく動作しました。
Python2系 でコマンドがインストールされていればうまく動作するだろうと推測しました。

修復作業

  • Python3系pip コマンドが使われてしまったことが原因では?
  • Python2系pip コマンドを使ったら問題が解消するのでは?

上記の推測をもとに環境の修復を実施。

# pipのバージョンを確認し、python3.7と対応していることを確認
$ pip --version
pip 19.0.2 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

# pip2のバージョンを確認し、python2.7と対応していることを確認
$ pip2 --version
pip 19.0.3 from /usr/local/lib/python2.7/site-packages/pip (python 2.7)

# pipでインストールされたbitbucket-cliを削除
$ pip uninstall bitbucket-cli
Uninstalling bitbucket-cli-0.5.1:
  Would remove:
    /usr/local/bin/bb
    /usr/local/bin/bitbucket
    /usr/local/lib/python3.7/site-packages/bitbucket/*
    /usr/local/lib/python3.7/site-packages/bitbucket_cli-0.5.1.dist-info/*
Proceed (y/n)? y
  Successfully uninstalled bitbucket-cli-0.5.1

# 試してみると、pip2でもbitbucket-cliがインストールされていたため削除
$ pip2 uninstall bitbucket-cli
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Uninstalling bitbucket-cli-0.5.1:
  Would remove:
    /usr/local/lib/python2.7/site-packages/bitbucket/*
    /usr/local/lib/python2.7/site-packages/bitbucket_cli-0.5.1.dist-info/*
Proceed (y/n)? y
  Successfully uninstalled bitbucket-cli-0.5.1

  # 改めてインストール
$ pip2 install bitbucket-cli

動作確認

$ bb help
****************************************************
  Warning: config file is readable by other users.
  If you are storing your password in this file,
  it may not be secure
****************************************************
usage: bitbucket <command> [<args>]
bb: error: argument create
  update
  delete
  clone
  create_from_local
  pull_request
  pull
  download
  list
  privilege: invalid choice: 'help' (choose from 'create', 'update', 'delete', 'clone', 'pull', 'create_from_local', 'pull_request', 'download', 'list', 'privilege', 'group-privilege', 'add_remote')

無事復旧しました!

ひとこと

Python3系 環境で pip install したツールが正常に動作しない場合は、一度 pip uninstall してから pip2 install することで解消できるかもしれません。
ぜひお試しください。

Bash, Python