Python
homebrew
macos
pyenv
Mojave

MacOSとHomebrewとpyenvで快適python環境を。

MacにPythonを複数インストールしてゴチャゴチャしてきたので、初心に返って綺麗に入れ直そうという思い至った際の作業のメモです。

これからMacでpython開発環境を構築する際のガイドになれば幸いです。

環境

MacBook Air (Mid 2013)
OS X Sierra バージョン10.12.1
Xcode Version 8.2.1 (7C1002)

XCodeをインストールする

Appleの提供する統合開発環境(IDE)のXcodeは色々とライブラリを提供してくれるので、便利な子です。入れておきましょう。
入手はAppStoreのXcodeのページを踏むとMacのアプリであるAppStoreを開いてくれますので、インストールボタンを押してからのんびりお茶でもいれててください。

終わったら、XCodeのCommand Line Toolsが次のステップに必要なのでいれておきましょう。

Terminal.appを開いて次のコマンドを実行します。

terminal.app
user@host $ xcode-select --install
xcode-select: note: install requested for command line developer tools

そうするとこんな感じの窓がポップアップしてくるので、installボタンをポチりとやってしまいましょう。
Screen Shot 2017-01-05 at 22.52.02.png

インストールがはじまる前にEULAを読まされそうになりますが、Agreeして先へ。これもしばらくかかります。

成功した暁にはxcode-selectがツールのパスを教えてくれます。めでたし、めでたし。

terminal.app
user@host $ xcode-select --print-path 
/Applications/Xcode.app/Contents/Developer

Homebrewをインストールする

続いてははhomebrew。HomeBrewの公式ページにあるコマンドをTerminalで実行します。

色々とチェックが入った後、実際に変更を行う前にパスワードを聞いてきます、/usr/local 以下にしか変更をしようとしていないかどうか軽く確認してから、パスワードを与えてあげましょう。

Terminal.app
user@host $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
==> This script will install:
/usr/local/bin/brew
/usr/local/share/doc/homebrew
/usr/local/share/man/man1/brew.1
/usr/local/share/zsh/site-functions/_brew
/usr/local/etc/bash_completion.d/brew
/usr/local/Homebrew
==> The following existing directories will be made group writable:
/usr/local/etc
/usr/local/include
/usr/local/lib
/usr/local/share
/usr/local/lib/pkgconfig
/usr/local/share/doc
/usr/local/share/man/man3
==> The following existing directories will have their owner set to alexs:
/usr/local/etc
/usr/local/include
/usr/local/lib
/usr/local/share
/usr/local/lib/pkgconfig
/usr/local/share/doc
/usr/local/share/man/man3
==> The following existing directories will have their group set to admin:
/usr/local/etc
/usr/local/include
/usr/local/lib
/usr/local/share
/usr/local/lib/pkgconfig
/usr/local/share/doc
==> The following new directories will be created:
/usr/local/Cellar
/usr/local/Homebrew
/usr/local/Frameworks
/usr/local/opt
/usr/local/sbin
/usr/local/share/zsh
/usr/local/share/zsh/site-functions
/usr/local/var

Press RETURN to continue or any other key to abort
==> /usr/bin/sudo /bin/chmod u+rwx /usr/local/etc /usr/local/include /usr/local/lib /usr/local/share /usr/local/lib/pkgconfig /usr/local/share/doc /usr/local/share/man/man3
Password:
==> /usr/bin/sudo /bin/chmod g+rwx /usr/local/etc /usr/local/include /usr/local/lib /usr/local/share /usr/local/lib/pkgconfig /usr/local/share/doc /usr/local/share/man/man3
==> /usr/bin/sudo /usr/sbin/chown alexs /usr/local/etc /usr/local/include /usr/local/lib /usr/local/share /usr/local/lib/pkgconfig /usr/local/share/doc /usr/local/share/man/man3
==> /usr/bin/sudo /usr/bin/chgrp admin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/share /usr/local/lib/pkgconfig /usr/local/share/doc
==> /usr/bin/sudo /bin/mkdir -p /usr/local/Cellar /usr/local/Homebrew /usr/local/Frameworks /usr/local/opt /usr/local/sbin /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var
==> /usr/bin/sudo /bin/chmod g+rwx /usr/local/Cellar /usr/local/Homebrew /usr/local/Frameworks /usr/local/opt /usr/local/sbin /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var
==> /usr/bin/sudo /bin/chmod 755 /usr/local/share/zsh /usr/local/share/zsh/site-functions
==> /usr/bin/sudo /usr/sbin/chown alexs /usr/local/Cellar /usr/local/Homebrew /usr/local/Frameworks /usr/local/opt /usr/local/sbin /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var
==> /usr/bin/sudo /usr/bin/chgrp admin /usr/local/Cellar /usr/local/Homebrew /usr/local/Frameworks /usr/local/opt /usr/local/sbin /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var
==> /usr/bin/sudo /bin/mkdir -p /Users/alexs/Library/Caches/Homebrew
==> /usr/bin/sudo /bin/chmod g+rwx /Users/alexs/Library/Caches/Homebrew
==> /usr/bin/sudo /usr/sbin/chown alexs /Users/alexs/Library/Caches/Homebrew
==> /usr/bin/sudo /bin/mkdir -p /Library/Caches/Homebrew
==> /usr/bin/sudo /bin/chmod g+rwx /Library/Caches/Homebrew
==> /usr/bin/sudo /usr/sbin/chown alexs /Library/Caches/Homebrew
==> Downloading and installing Homebrew...
remote: Counting objects: 4405, done.
remote: Compressing objects: 100% (2870/2870), done.
remote: Total 4405 (delta 2309), reused 2852 (delta 1379), pack-reused 0
Receiving objects: 100% (4405/4405), 2.49 MiB | 1.43 MiB/s, done.
Resolving deltas: 100% (2309/2309), done.
From https://github.com/Homebrew/brew
 * [new branch]      master     -> origin/master
 * [new tag]         0.1        -> 0.1
 * [new tag]         0.2        -> 0.2
 * [new tag]         0.3        -> 0.3
 * [new tag]         0.4        -> 0.4
 * [new tag]         0.5        -> 0.5
 * [new tag]         0.6        -> 0.6
 * [new tag]         0.7        -> 0.7
 * [new tag]         0.7.1      -> 0.7.1
 * [new tag]         0.8        -> 0.8
 * [new tag]         0.8.1      -> 0.8.1
 * [new tag]         0.9        -> 0.9
 * [new tag]         0.9.1      -> 0.9.1
 * [new tag]         0.9.2      -> 0.9.2
 * [new tag]         0.9.3      -> 0.9.3
 * [new tag]         0.9.4      -> 0.9.4
 * [new tag]         0.9.5      -> 0.9.5
 * [new tag]         0.9.8      -> 0.9.8
 * [new tag]         0.9.9      -> 0.9.9
 * [new tag]         1.0.0      -> 1.0.0
 * [new tag]         1.0.1      -> 1.0.1
 * [new tag]         1.0.2      -> 1.0.2
 * [new tag]         1.0.3      -> 1.0.3
 * [new tag]         1.0.4      -> 1.0.4
 * [new tag]         1.0.5      -> 1.0.5
 * [new tag]         1.0.6      -> 1.0.6
 * [new tag]         1.0.7      -> 1.0.7
 * [new tag]         1.0.8      -> 1.0.8
 * [new tag]         1.0.9      -> 1.0.9
 * [new tag]         1.1.0      -> 1.1.0
 * [new tag]         1.1.1      -> 1.1.1
 * [new tag]         1.1.2      -> 1.1.2
 * [new tag]         1.1.3      -> 1.1.3
 * [new tag]         1.1.4      -> 1.1.4
 * [new tag]         1.1.5      -> 1.1.5
 * [new tag]         1.1.6      -> 1.1.6
HEAD is now at 98dadd9 Merge pull request #1777 from alyssais/tests_tab_version
==> Tapping homebrew/core
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core'...
remote: Counting objects: 3830, done.
remote: Compressing objects: 100% (3709/3709), done.
remote: Total 3830 (delta 25), reused 349 (delta 8), pack-reused 0
Receiving objects: 100% (3830/3830), 3.07 MiB | 3.23 MiB/s, done.
Resolving deltas: 100% (25/25), done.
Tapped 3705 formulae (3,859 files, 9.6M)
==> Cleaning up /Library/Caches/Homebrew...
==> Migrating /Library/Caches/Homebrew to /Users/alexs/Library/Caches/Homebrew...
==> Deleting /Library/Caches/Homebrew...
Already up-to-date.
==> Installation successful!

==> Homebrew has enabled anonymous aggregate user behaviour analytics.
Read the analytics documentation (and how to opt-out) here:
  https://git.io/brew-analytics

==> Next steps:
- Run `brew help` to get started
- Further documentation: 
    https://git.io/brew-docs
/usr/bin/ruby -e   12.96s user 3.89s system 21% cpu 1:17.25 total

Homebrewの挙動をたしかめる。

Terminal.app
user@host $ brew doctor
Your system is ready to brew.

とでれば準備万端。

MacOS使いが荒いと色々文句を言われる場合も。それはWarningをしっかり読んで対処してしてあげましょう。

例文はこちら

Terminal.app
user@host $ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry and just ignore them. Thanks!

Warning: Your XQuartz (2.7.6) is outdated.
Please install XQuartz 2.7.9 (or delete the current version).
XQuartz can be updated using Homebrew-Cask by running
  brew cask reinstall xquartz

ご丁寧に直し方まで教えてくれるので、実行。

Terminal.app
user@host $ brew cask reinstall xquartz
==> Tapping caskroom/cask
Cloning into '/usr/local/Homebrew/Library/Taps/caskroom/homebrew-cask'...
remote: Counting objects: 3606, done.
remote: Compressing objects: 100% (3592/3592), done.
remote: Total 3606 (delta 33), reused 261 (delta 10), pack-reused 0
Receiving objects: 100% (3606/3606), 1.18 MiB | 0 bytes/s, done.
Resolving deltas: 100% (33/33), done.
Tapped 0 formulae (3,615 files, 3.7M)
==> Creating Caskroom at /usr/local/Caskroom
==> We'll set permissions properly so we won't need sudo in the future
Password:
==> Downloading https://dl.bintray.com/xquartz/downloads/XQuartz-2.7.11.dmg
######################################################################## 100.0%
==> Verifying checksum for Cask xquartz
==> Running installer for xquartz; your password may be necessary.
==> Package installers may write to any location; options such as --appdir are i
==> installer: Package name is XQuartz 2.7.11
==> installer: Upgrading at base path /
==> installer: The upgrade was successful.
==> /Library/LaunchAgents/org.macosforge.xquartz.startx.plist: service already l
🍺  xquartz was successfully installed!

この調子で他のWarningがある場合も直していきましょう。

HomeBrewを更新

HomeBrewは時折更新しておいた方がいいので、とりあえず更新しておきます。

Terminal.app
user@host $ brew update
Already up-to-date.

憧れのPython、でもその前に....。pyenvをインストール

HomeBrewが入った所で今度はPythonの番なのですが....。
pythonを直接入れるのではなく、複数のpython環境を使えるようにpyenvを使います。

HomeBrewが必要な物をインストールしてくれます。

Terminal.app
user@host $ brew install pyenv
...
==> Installing pyenv 
==> Downloading https://github.com/yyuu/pyenv/archive/v1.0.6.tar.gz
==> Downloading from https://codeload.github.com/yyuu/pyenv/tar.gz/v1.0.6
######################################################################## 100.0%
==> Caveats
To use Homebrew's directories rather than ~/.pyenv add to your profile:
  export PYENV_ROOT=/usr/local/var/pyenv

To enable shims and autocompletion add to your profile:
  if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
==> Summary
🍺  /usr/local/Cellar/pyenv/1.0.6: 544 files, 2.2M, built in 8 seconds

pyenv甩にprofileを調整

pyenvのインストールの最後の所に細かいヒント(Caveats)が書いてあったので、従っておきます。具体的には2点
- pyenvはデフォルトでは~/.pyenvにファイルを置きたがるので、/usr/loca/var/pyenvを使う様にお願いする
- pyenvには自動補完機能があるので、それを提供してもらう。

どちらもお好みのshellのprofileに入れるべきなので入れておきます(MacOSのデフォルトのshell,bashでは.bash_profileですね。)

以下のコマンドをTerminal.appに放り込みましょう

Terminal.app
cat << 'EOS' >> ~/.bash_profile
# pyenvさんに~/.pyenvではなく、/usr/loca/var/pyenvを使うようにお願いする
export PYENV_ROOT=/usr/local/var/pyenv

# pyenvさんに自動補完機能を提供してもらう
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi

EOS
source ~/.bash_profile

pyenvを確認

これでpyenvがインストールされ、使う準備が整ったはず!試してみよう。

Terminal.app
user@host $ pyenv --version
pyenv 1.0.6

user@host $ pyenv --help
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   commands    List all available pyenv commands
   local       Set or show the local application-specific Python version
   global      Set or show the global Python version
   shell       Set or show the shell-specific Python version
   install     Install a Python version using python-build
   uninstall   Uninstall a specific Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   version     Show the current Python version and its origin
   versions    List all Python versions available to pyenv
   which       Display the full path to an executable
   whence      List all Python versions that contain the given executable

See `pyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/yyuu/pyenv#readme

Pythonをインストール

まずはインストールできるバージョンを確認してみましょう。

Terminal.app
user@host $ pyenv install --list
Available versions:

沢山のバージョンが羅列されましたね...。

今回はpython3系列とpython2系列を一つづついれましょう。
2017/01/07の今日の場合、3.6.0 と2.7.13がそれぞれの最新バージョンです。

インストールは自前でコンパイルを始めるので時間もCPUも電気も食べます。

2.7.13のインストールの際には前に少しばかりおまじないを足します。これはXcodeが自身のライブラリをインストールする際の処理が変わったので、pythonのビルドツールがライブラリを発見できない自体が発生するからです。

詳しくは
pyenvのビルド問題のページBuild failed: "ERROR: The Python zlib extension was not compiled. Missing the zlib?"の項目に載っています。

Terminal.app
user@host $ CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install -v 2.7.13
Downloading Python-2.7.13.tar.xz...
-> https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tar.xz
Installing Python-2.7.13...
Terminal.app
user@host $ pyenv install 3.6.0
Downloading Python-3.6.0.tar.xz...
-> https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
Installing Python-3.6.0...

2018-10-08追記:
macos Mojaveではさらに以下のエラーでも怒られます。

Terminal.app
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1

これは以下のコマンドで解決できます。

Terminal.app
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

詳しくは[MacOS Mojave]pyenvでpythonのインストールがzlibエラーで失敗した時の対応を見てください。

普段使用するPythonの設定

デフォルトではMacOSのPythonを使おうとするので、折角いれたpython達が使われません。pyenvを使って設定してあげましょう。

Terminal.app
user@host $ pyenv global 3.6.0
user@host $ pyenv versions
  system
  2.7.13
* 3.6.0 (set by /usr/local/var/pyenv/version)
user@host $ python --version
python 3.6.0

これでようやくHomebrew+pyenv+pythonまでたどり着きました。