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



## きっかけ

![dQxlP.png](https://qiita-image-store.s3.amazonaws.com/0/82601/eac300f5-406e-3561-c599-9f507a98c9bd.png)

[AltUnityTester](https://stackoverflow.com/questions/45336375/ui-automation-for-unity-app)を知って触ろうと思い、[pythonで動くことを動画で知ったため](https://youtu.be/uTO-Uzt3AEQ)、そのままやっていたら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について

　<a href="https://www.slideshare.net/nowsprinting/altunitytester-gotandaunity-98287251"><img src="https://qiita-image-store.s3.amazonaws.com/0/82601/9d6095d0-f500-3210-fd2c-fc245b448e40.png"></a>


## 沼にハマる前

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

- `ImportError: No module named appium`
- `ImportError: No module named altunityrunner`

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

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

OSSでもあるAltUnityTesterは、[AssetStore](https://assetstore.unity.com/packages/tools/utilities/altunitytester-112101)と[Gitlab](https://gitlab.com/altom/altunitytester)からダウンロードできます。

Pythonを使うので[Pythonのサポート](https://gitlab.com/altom/altunitytester#python-27-altunityrunner-module)状況を確認すると、

<img width="718" alt="スクリーンショット 2018-06-06 15.13.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/82601/b62ccfa7-10f0-b7d9-0c74-c7d46fb1e8ae.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向けでやり直して作業を進めていました。

すると、

```bash
$ 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'`



```bash
$ 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/pyenv](https://github.com/pyenv/pyenv)を用いてMacの環境に入っているPythonを全てアンインストール（`brew uninstall python`）し、pyenvでPythonを管理するようにしました。


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

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

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

```bash

$ 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`

おそらく`Operation not permitted`が出る方が多いはずです。
「**Mac rm Operation not permitted**」でだいたいいろんな記事がヒットするので調整しましょう。

- [初心者向け　MacでOperation not permittedの解決方法](https://qiita.com/iwaseasahi/items/9d2e29b02df5cce7285d)

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

```bash
$ 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
$ 
```


### `ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?`

Mojaveの方は、`ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?`に苦しめられると思います笑
[pyenv/pyenv](https://github.com/pyenv/pyenv)の[wiki](https://github.com/pyenv/pyenv/wiki/Common-build-problems)に詳細がまとまっているらしいのでいくつか記事を参考に対応してください。

- [pyenv installでMissing the OpenSSL lib?と言われる](https://qiita.com/sato_9/items/04d219618856eaaeb341)


### `Read-only file system`

macOS Catalina で`Read-only file system`が発生します。

- [macOS 10.15 CatalinaでファイルシステムがRead-Onlyになる仕様はオプトアウトなしで、完全に無効にすることは不可能。 ](https://applech2.com/archives/20190610-read-only-system-volume-apfs-refresh.html)

調査したところ`Operation not permitted`と同じ手順なのですが、PCが再起動する度に設定が初期化されて適応できないため、**最初に入っている標準システムなどを消す事が出来なくなった**ようです。

Catalina以降は本内容を諦めて`$python ...`と`$python3 ...`で運用するしかないようです笑汗


### pyenvでPythonをインストール

以下のように例を記載していますが、環境に応じて作業が異なります。
[pyenv/pyenv](https://github.com/pyenv/pyenv)のREADME.mdを読み、各自環境に合った作業を行ってください。


```bash
$ 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...。

- [Homebrew - 1.5.0](https://brew.sh/2018/01/19/homebrew-1.5.0/)
- [ついにMacでPython3がデフォルトに?! - Python2と3のどちらを使えば良い？](https://news.mynavi.jp/article/zeropython-24/)

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

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


## おまけ： 絶対やってはいけない`sudo rm -fr /System/Library/Frameworks/Python.framework`

本当は、`sudo rm -fr /Library/Frameworks/Python.framework`であるところを根本であるSystem配下の`Python.framework`を消してしまった場合、Xcodeが起動できなくなり、gitや他ライブラリなどが使えなくなることになってしまいます。

そのため、速やかに`Python.framework`を再インストールする必要があるのですが、公式などで`Python.framework`をインストールするページが見つからないため、MacOSに慣れていない方はOSを再インストールすることを考えると思います。

その際、身近な方でMacを持っている場合は、その方に`/System/Library/Frameworks/Python.framework`をzipなどで貰い、`sudo cp -pR ~/Downloads/Python.framework/* /System/Library/Frameworks/Python.framework/`することをオススメします（別のMac環境でやってしまった経験ですw）。


## 参考記事集

- [Appiumを使ってスマートフォンアプリのテストを自動化する - Python編](https://qiita.com/skinoshita/items/211ca23edbb5f2776771)
- [公式サイトからMacにインストールしたPythonをアンインストールする方法](https://peachcle.com/uninstall-python-for-mac/)
- [【Mac】【Homebrew】Python 3 をアンインストールする手順](http://oki2a24.com/2016/04/16/uninstall-python3-with-homebrew-in-mac/)
- [pythonのアンインストール](https://qiita.com/SonoT/items/24f8a14555aea4961f9b)
- [Mac OS XでPython2.xからPython3.xに切り替えた話](http://multiplus.hatenablog.com/entry/2016/07/24/124320)
- [Python 2系と3系の共存](https://qiita.com/nakamura_hikaru/items/639204ee7c7c8cd51a90)
- [HomebrewのインストールからpyenvでPythonのAnaconda環境構築までメモ](https://qiita.com/franxx/items/2d066801a7464a676994)
- [Mac(Homebrew)でPython(pyenv/virtualenv)開発環境を作る](https://qiita.com/its/items/24f8b20aa2106819dfb3)
- [pyenvはインストール済みだが、pyenvコマンドが効かない](http://pyoonn.hatenablog.com/entry/2014/09/24/152610)
- [Mac に pyenv + pip で Ansible 用 python を作る](http://keyamb.hatenablog.com/entry/2014/06/11/081650)
- [Macに入れた各種Pythonを全部アンインストールしてAnacondaを入れなおす](http://www.statsbeginner.net/entry/2015/11/05/020521)
- [コマンドラインでbrew doctorすると警告だらけになっちゃった助けて](https://qiita.com/fumi_042/items/55be8fb37cc23325b7c2)