Check! Mac に PyObjc インストールするときのトラブルシューティング

こんにちは、 @dz_ こと大平かづみです。

Prologue - はじめに
===
作業過程で PyObjc の導入時にいくつかつまづいたので、備忘録を残しておきます。

```bash 
# PyObjc を導入する （アップデート）
$ pip install -U pyobjc
```

作業環境
----

- Mac OS X El Capitan (10.11.5)
- python 2.7.12 (※)

※ 当初、 システムデフォルトの python で後述のエラーで進めなくなったため、システムデフォルト以外の python をインストールして対応しました。特に理由はありませんが、 2系の一番新しいバージョンを利用しました。3系でも大丈夫でした。

トラブルシューティング
====

`tool 'xcodebuild' requires Xcode` とエラー
----
### エラー内容
`xcodebuild` が、コマンドラインツールではなく Xcode 自体を要求している、というエラーです。

```bash
$ sudo pip install -U pyobjc

Collecting pyobjc
  Using cached pyobjc-3.1.1.tar.gz
Collecting py2app>=0.10 (from pyobjc)
  Using cached py2app-0.10.tar.gz
Collecting pyobjc-core==3.1.1 (from pyobjc)
  Using cached pyobjc-core-3.1.1.tar.gz
    Complete output from command python setup.py egg_info:
    running egg_info
    creating pip-egg-info/pyobjc_core.egg-info
    writing include/pyobjc-compat.h to pip-egg-info/pyobjc_core.egg-info/include/pyobjc-compat.h
    writing include/pyobjc-api.h to pip-egg-info/pyobjc_core.egg-info/include/pyobjc-api.h
    writing pip-egg-info/pyobjc_core.egg-info/PKG-INFO
    writing namespace_packages to pip-egg-info/pyobjc_core.egg-info/namespace_packages.txt
    writing top-level names to pip-egg-info/pyobjc_core.egg-info/top_level.txt
    writing dependency_links to pip-egg-info/pyobjc_core.egg-info/dependency_links.txt
    writing manifest file 'pip-egg-info/pyobjc_core.egg-info/SOURCES.txt'
    warning: manifest_maker: standard file '-c' not found
    
    xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
    Traceback (most recent call last):

...<略>...
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/lc/x_6095kd7xz1x7cjkp7vnmsm0000gp/T/pip-build-Aq79NE/pyobjc-core/
```

### 対処
Mac App Store から [Xcode](https://itunes.apple.com/us/app/xcode/id497799835) 本体をインストールしてください。

`You have not agreed to the Xcode license agreements` とエラー
----
### エラー内容

以下のエラーが出る場合は、xcode のライセンス承諾が終わっていません。

```bash
$ sudo pip install -U pyobjc

Password:

Collecting pyobjc
  Downloading pyobjc-3.1.1.tar.gz
Collecting py2app>=0.10 (from pyobjc)
  Downloading py2app-0.10.tar.gz (1.7MB)
    100% |████████████████████████████████| 1.7MB 694kB/s 
Collecting pyobjc-core==3.1.1 (from pyobjc)
  Downloading pyobjc-core-3.1.1.tar.gz (2.2MB)
    100% |████████████████████████████████| 2.2MB 564kB/s 
    Complete output from command python setup.py egg_info:
    running egg_info
    creating pip-egg-info/pyobjc_core.egg-info
    writing include/pyobjc-compat.h to pip-egg-info/pyobjc_core.egg-info/include/pyobjc-compat.h
    writing include/pyobjc-api.h to pip-egg-info/pyobjc_core.egg-info/include/pyobjc-api.h
    writing pip-egg-info/pyobjc_core.egg-info/PKG-INFO
    writing namespace_packages to pip-egg-info/pyobjc_core.egg-info/namespace_packages.txt
    writing top-level names to pip-egg-info/pyobjc_core.egg-info/top_level.txt
    writing dependency_links to pip-egg-info/pyobjc_core.egg-info/dependency_links.txt
    writing manifest file 'pip-egg-info/pyobjc_core.egg-info/SOURCES.txt'
    warning: manifest_maker: standard file '-c' not found
    
    
    You have not agreed to the Xcode license agreements, please run 'xcodebuild -license' (for user-level acceptance) or 'sudo xcodebuild -license' (for system-wide acceptance) from within a Terminal window to review and agree to the Xcode license agreements.

...<略>...

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /private/tmp/pip-build-qqJvg7/pyobjc-core/
```

### 対処
`xcodebuild` でライセンス承諾を行います。

```bash
# Xcode のライセンスに承諾する
$ sudo xcodebuild -license

Password:


You have not agreed to the Xcode license agreements. You must agree to both license agreements below in order to use Xcode.

Hit the Enter key to view the license agreements at '/Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf'
```
ここで `Enter` キーを押下すると、ライセンスの契約文書が表示されるので、　`space` キーで下まで読みます。


```bash
...<略>...

By typing 'agree' you are agreeing to the terms of the software license agreements. Type 'print' to print them or anything else to cancel, [agree, print, cancel]
```

このように表示されたら、 `agree` と入力することで、ライセンスの承諾が完了します。

```bash
You can view the license agreements in Xcode's About Box, or at /Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf
```

`pyobjc-framework-AVKit` でエラー
----
### エラー内容
```bash
$ sudo pip install -U pyobjc

Password:

Collecting pyobjc
  Downloading pyobjc-3.1.1.tar.gz
Collecting py2app>=0.10 (from pyobjc)
  Downloading py2app-0.10.tar.gz (1.7MB)
    100% |████████████████████████████████| 1.7MB 562kB/s 
Collecting pyobjc-core==3.1.1 (from pyobjc)
  Downloading pyobjc-core-3.1.1.tar.gz (2.2MB)
    100% |████████████████████████████████| 2.2MB 595kB/s 
Collecting pyobjc_framework-AVKit==3.1.1 (from pyobjc)
  Downloading pyobjc-framework-AVKit-3.1.1.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/tmp/pip-build-8BPKlF/pyobjc-framework-AVKit/setup.py", line 35, in <module>
        if fn.startswith('_AVKit')
      File "pyobjc_setup.py", line 496, in setup
        **k
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/core.py", line 111, in setup
        _setup_distribution = dist = klass(attrs)
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/setuptools/dist.py", line 239, in __init__
        self.fetch_build_eggs(attrs.pop('setup_requires'))
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/setuptools/dist.py", line 263, in fetch_build_eggs
        parse_requirements(requires), installer=self.fetch_build_egg
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py", line 580, in resolve
        raise VersionConflict(dist,req) # XXX put more info here
    pkg_resources.VersionConflict: (pyobjc-core 2.5.1 (/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC), Requirement.parse('pyobjc-core>=3.1.1'))
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /private/tmp/pip-build-8BPKlF/pyobjc-framework-AVKit/
```

### 原因解析

```bash
        raise VersionConflict(dist,req) # XXX put more info here
    pkg_resources.VersionConflict: (pyobjc-core 2.5.1 (/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC), Requirement.parse('pyobjc-core>=3.1.1'))
```

どうやら、 `pyobjc-core` のバージョンが、2.5.1 がインストールされているが、3.1.1 が必要とのこと。

### 対処

```bash
# pip でインストールされたパッケージ一覧を表示する
$ pip list

...<略>...

pyobjc-core (2.5.1)

...<略>...
```

`sudo pip install -U pyobjc-core` で明示的にアップデートしようとしましたが、 `[Errno 1] Operation not permitted` となりアップできませんでした。

そこで、システムデフォルト以外の python を明示的にインストールして対応しました。 なお、各言語のバージョン管理は `anyenv` がおすすめです。 (参考: [Check! anyenv を使って phpenv を使おう（Mac OS X 編）](http://qiita.com/dz_/items/a229b368c824117a79ec))

```bash
# python のバージョン確認
$ python --version
Python 2.7.10

# pip のバージョン確認
$ pip --version
pip 9.0.1 from /Library/Python/2.7/site-packages (python 2.7)

# anyenv を使って pyenv をインストール
$ anyenv install pyenv

# シェルを再読込み
$ exec $SHELL -l

# python 3.5.2 をインストール
$ pyenv install 2.7.12

# インストールされたバージョンを確認
$ pyenv versions
* system (set by /Users/user/.anyenv/envs/pyenv/version)
  2.7.12

# python 2.7.12 を有効化
$ pyenv global 2.7.12

# pip の更新
$ pip install --upgrade pip
```

この状態で `pyobjc-core` のインストールを行うと、正常に完了しました。

```bash
# pyobjc-core のインストール
$ pip install -U pyobjc-core
Collecting pyobjc-core
  Using cached pyobjc-core-3.1.1.tar.gz
Installing collected packages: pyobjc-core
  Running setup.py install for pyobjc-core ... done
Successfully installed pyobjc-core-3.1.1
```

なお、 ここで `pyobjc-core` ではなく、 `pyobjc` 自体をインストール（アップデート）しても問題ありません。

Epilogue - おわりに
====
本当は、Mac に [pyBluez](https://github.com/karulis/pybluez) を入れようとした際のトラブルシューティングなんですが、 PyObjc のインストールをクリアしても、肝心の pyBluez が以下の問題でインストールできず… 志半ばに終わったのでした。（ちなみに、pyBluez の問題は修正済みで、そのうちリリースに載ってくるようです。）

- [Mac PyBluez installation failure: pyobjc 3.1.1, OS X 10.11.5 #133](https://github.com/karulis/pybluez/issues/133)