Python
Mac
brew
pip
pyenv

MacでPythonの2.xと3.xを共存させるためにpyenvを入れた時の話し

きっかけ

dQxlP.png

AltUnityTesterを知って触ろうと思い、pythonで動くことを動画で知ったため、そのままやっていたらVSCode上で「ターミナルでPythonファイルを実行」でImportError: No module named appiumとエラー。

そこから色々必要なものを入れていったら、、、Pythonもしくはpipのバージョンで2.xと3.xで沼にハマったため、そこからのいろんな問題を解決した内容をまとめようと思い、このQiita記事を作りました。

最終的にはpyenvでPythonの各バージョンを管理するんですが、導入する前の環境は、

  • MacBookPro13 - MacOS Sierra 10.12.6
    • Python 2.x
      • /usr/bin/python2.6
      • /usr/bin/python2.7
    • Python 3.x
      • /usr/local/lib/python3.6

になります。

AltUnityTesterについて

 

沼にハマる前

最初は、AltUnityTesterで必要なものとして次のエラーが出ました。

  • ImportError: No module named appium
  • ImportError: No module named altunityrunner

この2点に関しては、単純にインストールしていました。
ですが、今思えばすでにそこで失敗していました...。

AltUnityTesterのPythonのサポートについて

OSSでもあるAltUnityTesterは、AssetStoreGitlabからダウンロードできます。

Pythonを使うのでPythonのサポート状況を確認すると、

スクリーンショット 2018-06-06 15.13.30.png

 

とのことで、Python3.xはまだサポートされていない中、最初気づかずにappiumやaltunityrunnerをpip3でインストールして対応していました。

python3 ...で実行しようとしていたため、途中からPython2.xで対応するようにpip2 install ...とpip3でインストールしていた同じ作業を行いました。

さて、ここまでがPythonの2.xと3.xのバージョンの沼にハマる入門編で、ここからが本格的にハマっていろんな対応をした内容になります。

No such file or directory

Python3.xでは、すでに先行して入れていたのですが、結局Python2.xで扱わないといけないことを途中で知ったので、インストールコマンドを全て2.x向けでやり直して作業を進めていました。

すると、

$ sudo pip install selenium
sudo: unable to execute /usr/local/bin/pip: No such file or directory

$ pip install --upgrade pip
-bash: /usr/local/bin/pip: /usr/local/opt/python/bin/python2.7: bad interpreter: No such file or directory

$ which python
/usr/local/bin/python
$ which pip
/usr/local/bin/pip
$ python -V
Python 2.7.13

となって、No such file or directoryとか出力されるようになって、どうしようもない状況...

ModuleNotFoundError: No module named 'runner'

$ python "/Users/user_name/Unity/AdventureGame/AppiumTests/adventure-tests.py"
Traceback (most recent call last):
  File "/Users/user_name/Unity/Adventure - Sample Game/AppiumTests/adventure-tests.py", line 4, in <module>
    from altunityrunner import AltrunUnityDriver
  File "/usr/local/lib/python3.6/site-packages/altunityrunner/__init__.py", line 1, in <module>
    from runner import AltElement, AltrunUnityDriver
ImportError: No module named runner

これに関しては、

Requirement already satisfied: runner in /usr/local/lib/python3.6/site-packages (1.1)

となり、どうも2.xが3.xのpipを見ているようでどうしても先に進めない状況になっていました。

pyenvの登場

打つ手なしなので全部まっさらにし、2.xと3.xを使えるようにしておきたいため、pyenvを用いてMacの環境に入っているPythonを全てアンインストール(brew uninstall python)し、pyenvでPythonを管理するようにしました。

Pythonを全てアンインストール

環境とコマンドの結果を見て気づいた人もいると思いますが、Pythonの場所は複数存在しているため、手作業はとても辛いです。

ですが、Pythonを全てアンインストールしたところ、シンボリックリンクで存在するPython関連のディレクトリが存在するため、最後の方が結構手作業になりました。

$ brew uninstall python3

$ python --version
Python 2.7.10

$ ls -lt /Library/Python/
total 0
drwxr-xr-x  3 root  wheel  102  4  5  2017 2.7
drwxr-xr-x  3 root  wheel  102  2  7  2017 2.6

$ ls -lt /usr/bin/ | grep python
lrwxr-xr-x   1 root   wheel         75  5 26  2017 python2.6 -> ../../System/Library/Frameworks/Python.framework/Versions/2.6/bin/python2.6
lrwxr-xr-x   1 root   wheel         82  5 26  2017 python2.6-config -> ../../System/Library/Frameworks/Python.framework/Versions/2.6/bin/python2.6-config
lrwxr-xr-x   1 root   wheel         75  5 26  2017 python2.7 -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
lrwxr-xr-x   1 root   wheel         82  5 26  2017 python2.7-config -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7-config
lrwxr-xr-x   1 root   wheel         76  5 26  2017 pythonw2.6 -> ../../System/Library/Frameworks/Python.framework/Versions/2.6/bin/pythonw2.6
lrwxr-xr-x   1 root   wheel         76  5 26  2017 pythonw2.7 -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/pythonw2.7
-rwxr-xr-x   1 root   wheel      66576  4 29  2017 pythonw
-rwxr-xr-x   1 root   wheel      66576  4 29  2017 python
-rwxr-xr-x   5 root   wheel        925  2  7  2017 python-config

$ sudo rm -fr /Library/Frameworks/Python.framework

$ ls -lt /Library/Python/
total 0
drwxr-xr-x  3 root  wheel  102  4  5  2017 2.7
drwxr-xr-x  3 root  wheel  102  2  7  2017 2.6

$ sudo rm -fr /Library/Python

$ sudo rm -fr /usr/bin/python2.7
rm: /usr/bin/python2.7: Operation not permitted
$ rm -fr /usr/bin/python2.7
rm: /usr/bin/python2.7: Operation not permitted
$ unlink /usr/bin/python2.6
unlink: /usr/bin/python2.6: Operation not permitted
$ sudo unlink /usr/bin/python2.6
unlink: /usr/bin/python2.6: Operation not permitted

 

ここでOperation not permittedの問題が出たためPCを再起動することに...

Operation not permittedの解決方法

初心者向け MacでOperation not permittedの解決方法

さて、Pythonを全てアンインストールの続きです。

$ sudo rm -fr /usr/bin/python2.7
$ sudo rm -fr /usr/bin/python2.7-config 
$ sudo rm -fr /usr/bin/pythonw2.7
$ sudo rm -fr /usr/bin/python2.6
$ sudo rm -fr /usr/bin/python2.6-config 
$ sudo rm -fr /usr/bin/pythonw2.6 
$ sudo rm -fr /usr/bin/pythonw
$ sudo rm -fr /usr/bin/python-config 
$ sudo rm -fr /usr/bin/python
$ ls -lt /usr/bin/ | grep python
$ 

pyenvでPythonをインストール

$ brew install pyenv

$ brew install pyenv-virtualenv

echo 'export PYENV_ROOT="${HOME}/.pyenv"' >> ~/.bash_profile
echo 'export PATH="${PYENV_ROOT}/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
source ~/.bash_profile

# いろいろインストールしてglobal設定

$ pyenv versions
* 2.7.10 (set by /Users/user_name/.pyenv/version)
  3.6.5
  anaconda-4.0.0
  anaconda3-4.0.0

まとめ

2.xと3.xで色々と問題になりやすかったり、少し前に3.xに移行しよう的なニュースがトピックに出てたりして、余計悩ましいPython...。

MacでPythonを扱う際には、一旦brewで全消しして、pyenvを入れて2.xと3.xを共存させて、切り替えて扱うようにすれば多少スッキリします!

この後のAltUnityTesterに関しては、本記事とは別でまとめようと思います。

参考記事集