Python3環境で `pip install` したコマンドラインツールが動作しない場合の対処
はじめに
先日投稿した以下のエントリにて、 「自分の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-cli
が python2系 環境では正常に動作していましたが、 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
することで解消できるかもしれません。
ぜひお試しください。
ディスカッション
コメント一覧
まだ、コメントがありません