Edited at

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

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

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

追記:2019年7月にアップデートしました。


環境

MacBook Pro (15-inch 2017)

macOS Mojave Version 10.14.5

Xcode Version 10.2.1 (10E1001)


XCodeをインストールする

Appleの提供する統合開発環境(IDE)のXcodeは色々とライブラリを提供してくれるので、便利な子です。入れておきましょう。

入手はAppStoreのXcodeのページを踏むとMacのアプリであるAppStoreを開いてくれますので、インストールボタンを押してからのんびりお茶でもいれててください。

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

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


terminal.app

user@host $ xcode-select --install

xcode-select: error: command line tools are already installed, use "Software Update" to install updates

すでにツールがインストールされている旨を通知されます。これは大助かり。ただ、インスールされているだけでEULAには同意していないので、実際にツールを使う際にには

shell-session:terminal.app

user@host $ make
Agreeing to the Xcode/iOS license requires admin privileges, please run “sudo xcodebuild -license” and then retry this command.

と怒られたりします。なので、支持に従ってEULAに同意します。

shell-session:terminal.app

user@host $ xcode-select -license

EULAへの同意を求められるので、EULAをすっ飛ばした後 隅々まで読んでからagreeと入力して終わりです。

インストールされているのをしっかり確認しましょう。


terminal.app

user@host $ xcode-select --print-path 

/Applications/Xcode.app/Contents/Developer

これでXcodeの準備は万全です。

場合によって、ツールにインストールを求められる場合もありますので、その場合にはインストールしましょう。


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 new directories will be created:
/usr/local/bin
/usr/local/etc
/usr/local/include
/usr/local/lib
/usr/local/share
/usr/local/var
/usr/local/opt
/usr/local/share/zsh
/usr/local/share/zsh/site-functions
/usr/local/var/homebrew
/usr/local/var/homebrew/linked
/usr/local/Cellar
/usr/local/Caskroom
/usr/local/Homebrew
/usr/local/Frameworks

Press RETURN to continue or any other key to abort
==> /usr/bin/sudo /bin/mkdir -p /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Homebrew /usr/local/Frameworks
Password:
==> /usr/bin/sudo /bin/chmod g+rwx /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Homebrew /usr/local/Frameworks
==> /usr/bin/sudo /bin/chmod 755 /usr/local/share/zsh /usr/local/share/zsh/site-functions
==> /usr/bin/sudo /usr/sbin/chown alex.sayle /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Homebrew /usr/local/Frameworks
==> /usr/bin/sudo /usr/bin/chgrp admin /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Homebrew /usr/local/Frameworks
==> /usr/bin/sudo /bin/mkdir -p /Users/alex.sayle/Library/Caches/Homebrew
==> /usr/bin/sudo /bin/chmod g+rwx /Users/alex.sayle/Library/Caches/Homebrew
==> /usr/bin/sudo /usr/sbin/chown alex.sayle /Users/alex.sayle/Library/Caches/Homebrew
==> Downloading and installing Homebrew...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 124526 (delta 0), reused 2 (delta 0), pack-reused 124520
Receiving objects: 100% (124526/124526), 29.49 MiB | 6.65 MiB/s, done.
Resolving deltas: 100% (91240/91240), done.
From https://github.com/Homebrew/brew
* [new branch] master -> origin/master
* [new tag] 0.1 -> 0.1
....
* [new tag] 2.1.6 -> 2.1.6
HEAD is now at 895467ad9 Merge pull request #6273 from joehorsnell/gracefully_handle_missing_user_env_var
==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
https://github.com/Homebrew/brew#donations
==> Tapping homebrew/core
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core'...
remote: Enumerating objects: 5021, done.
remote: Counting objects: 100% (5021/5021), done.
remote: Compressing objects: 100% (4795/4795), done.
remote: Total 5021 (delta 51), reused 1131 (delta 35), pack-reused 0
Receiving objects: 100% (5021/5021), 4.02 MiB | 3.71 MiB/s, done.
Resolving deltas: 100% (51/51), done.
Tapped 2 commands and 4809 formulae (5,064 files, 12.5MB).
Already up-to-date.
==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
https://docs.brew.sh/Analytics

==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
https://github.com/Homebrew/brew#donations
==> Next steps:
- Run `brew help` to get started
- Further documentation:
https://docs.brew.sh



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://homebrew.bintray.com/bottles/pyenv-1.2.12.mojave.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/32/328765d7bfe1c36a25274b5a985b3e64300f06d13495e248275b92e4502d6da3?__gda__=exp=1562551844~hmac=19df71a25953c9718ee98ec9f44f639d9726d86b9a6a204649c0a2c26526857
######################################################################## 100.0%
==> Pouring pyenv-1.2.12.mojave.bottle.tar.gz
🍺 /usr/local/Cellar/pyenv/1.2.12: 648 files, 2.4MB
==> 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.2.12: 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.2.12

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系列を一つづついれましょう。


Terminal.app

user@host $ pyenv install --list  | egrep '^[ ]+[23]\.[0-9\.]+$' 


とやって、オフィシャルなpythonたちを探して上げます。2.xと3.xの最新はそれぞれ、2019-07、こんな感じですね。


Terminal.app

user@host $ pyenv install --list  | egrep '^[ ]+[23]\.[0-9\.]+$' | grep ' 2' | tail -n 1

2.7.16


Terminal.app

user@host $ pyenv install --list  | egrep '^[ ]+[23]\.[0-9\.]+$' | grep ' 3' | tail -n 1

3.7.3

インストールは自前でコンパイルを始めるので時間もCPUも電気も食べます。電源を確保した上でやりましょう。


Terminal.app

user@host $ pyenv install 3.6.4

python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-3.6.4.tar.xz...
-> https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tar.xz
Installing Python-3.6.4...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.6.4 to /usr/local/var/pyenv/versions/3.6.4

pyenv install 3.6.4 179.71s user 43.90s system 213% cpu 1:44.52 total



Terminal.app

user@host $ pyenv install 3.7.3

python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-3.7.3.tar.xz...
-> https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz
Installing Python-3.7.3...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.7.3 to /usr/local/var/pyenv/versions/3.7.3

pyenv install 3.7.3 161.85s user 36.47s system 160% cpu 2:03.42 total


以下は過去の事例で2019現在は筆者がpython2.xをインストールしていないので、古文書化しています。

2017-01-01:

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.7.3

user@host $ pyenv versions
system
2.7.16
3.6.4
* 3.7.3 (set by /usr/local/var/pyenv/version)
user@host $ python --version
python 3.7.3

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


Pythonの設定 (Virtualenv, Pipenv)

pythonの使い方は人それぞれですが、昨今はpipenvが流行ってますね。

私は長らくvirtualenvを使ってきたので、今は両方使ってます。そのための初期設定まではやってしまいましょう。

まずは既存のパッケージの古いやつがないかチェックです。


Terminal.app

user@host $ python -m pip list 

Package Version
---------- -------
pip 19.0.3
setuptools 40.8.0
You are using pip version 19.0.3, however version 19.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

いますね....。上げましょう。


Terminal.app

user@host $ python -m pip install pip --upgrade 


続いて、pipenvとvirtualenvをインストールして、ベースのpythonにはこれ以上入れないようにします。

後はvirtualenvかpipenvで制作するプロジェクトの中で吸収してもらいます。


Terminal.app

user@host $ python -m pip install pipenv virtualenv 


最後にpyenvのpluginであるpyenv-virtualenvを入れて終わりです。


Terminal.app

user@host $ brew install pyenv-virtualenv

==> Downloading https://github.com/pyenv/pyenv-virtualenv/archive/v1.1.3.tar.gz
==> Downloading from https://codeload.github.com/pyenv/pyenv-virtualenv/tar.gz/v1.1.3
######################################################################## 100.0%
==> ./install.sh
==> Caveats
To enable auto-activation add to your profile:
if which pyenv-virtualenv-init > /dev/null; then eval "$(pyenv virtualenv-init -)"; fi
==> Summary
🍺 /usr/local/Cellar/pyenv-virtualenv/1.1.3: 20 files, 62.2KB, built in 5 seconds
brew install pyenv-virtualenv 3.92s user 2.24s system 73% cpu 8.346 total

皆様も良いpythonライフを。