こんにちは、 @dz_ こと大平かづみです。
Prologue - はじめに
作業過程で PyObjc の導入時にいくつかつまづいたので、備忘録を残しておきます。
# 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 自体を要求している、というエラーです。
$ 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 本体をインストールしてください。
You have not agreed to the Xcode license agreements
とエラー
エラー内容
以下のエラーが出る場合は、xcode のライセンス承諾が終わっていません。
$ 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
でライセンス承諾を行います。
# 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
キーで下まで読みます。
...<略>...
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
と入力することで、ライセンスの承諾が完了します。
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
でエラー
エラー内容
$ 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/
原因解析
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 が必要とのこと。
対処
# 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 編))
# 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
のインストールを行うと、正常に完了しました。
# 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 を入れようとした際のトラブルシューティングなんですが、 PyObjc のインストールをクリアしても、肝心の pyBluez が以下の問題でインストールできず… 志半ばに終わったのでした。(ちなみに、pyBluez の問題は修正済みで、そのうちリリースに載ってくるようです。)