LoginSignup
17
19

More than 5 years have passed since last update.

macOSにPython環境を構築する(pyenv+Anaconda)

Last updated at Posted at 2018-07-26

macOSにPython環境を構築する(pyenv+Anaconda)

macOSにPythonの開発環境を構築しました。データ分析と機械学習に興味があるためです。以下に、環境構築手順をまとめます。なお、構築した環境の維持、削除については、こちらにまとめました。

ちなみに、別構成(Python+pipenv)での構築手順は、こちらです。私自身は、2018/08/16現在、「Python+pipenv」で構築した環境を利用しています。

要件

  • 開発用のPythonは、システムにプリインストールされているPythonと分けてインストールすること
  • サンドボックス化された、複数の環境を持てるようにすること

構成

  • macOS High Sierra
  • Homebrew
  • pyenv
  • Anaconda(3系)
  • TensorFlow / Keras

変更履歴

  • 2018/07/26

    • 初版作成
  • 2018/07/28

    • タイトルに構成を明記
    • PDFの図表表示位置を明示的に指定する手順を追加(手順8)
    • 設定ファイルへの追記内容に、コメントを追加(手順8、9)
    • フォントについての説明を追加(手順9の補足)
    • 動作確認用Kerasスクリプトを一部修正(手順11)
  • 2018/08/04

    • 手順8の修正対象ファイルを、ipython_config.pyからipython_kernel_config.pyに訂正
  • 2018/08/04

    • 段落のインデントを行う設定手順を追加(手順9)
  • 2018/08/05

    • 変更履歴の追加
    • 注意事項に、-bash: hoge: command not found発生時の対応手順を追加
    • 最新版のAnacondaをインストールするように明記(手順5)
    • コマンドcondaを機能拡張するための、~/.bashrcへの設定手順を追加(手順5)
    • 仮想環境作成時、ベース環境をクローンして作成する手順に変更(手順7)
    • 仮想環境作成後、conda update --allする手順を追加(手順7)
    • TensorFlow、Kerasを、pipでなくcondaでインストールする手順に変更(手順7)
    • コマンドsource activateconda activateに変更(手順7、8)
    • 全般に、見出しのレベルを変更
  • 2018/08/05

    • 冒頭に維持管理手順へのリンクを追加
    • 補足追記(手順7)
  • 2018/08/13

    • 補足、参考サイト追記(手順6)
  • 2018/08/16

    • 冒頭に別構成での環境構築手順へのリンクを追加

概要

以下手順で環境構築します。

  1. Bash設定ファイルの整備
  2. Xcode、Command Line Toolsのインストール
  3. Homebrewのインストール
  4. pyenvのインストール
  5. Anacondaのインストール
  6. ワークスペースの作成
  7. 仮想環境の作成
  8. Jupyter Notebookの設定
  9. 日本語まわりの設定
  10. GNU Core Utilitiesのインストール
  11. 動作確認

注意事項

注意事項

  • コマンド内に<作成したワークスペース>等の記載がある場合、各自の環境に合わせて読み替えて実行してください。冗長となるので、特に見落としそうな箇所を除けば、但し書きを書いていません。
pyenv versions
python -V
cd <作成したワークスペース>
pyenv versions
python -V
pyenv local anaconda<バージョン>
pyenv versions
python -V
  • コマンドは、一行ずつ実行してください。
  • 何かをインストール、設定したはずなのに、-bash: hoge: command not foundと言って怒られるときは、コマンドexec $SHELL -lで、シェルを再起動させると大体うまくいきます。

参考サイト

謝辞

環境構築、および、本稿の作成にあたっては、参考サイトに記載のサイトのほかにも、多くのサイトを参考にさせて頂きました。心より御礼申し上げます。

手順1. Bash設定ファイルの整備

目的

  • Bash設定ファイルを作成し、メンテナンスしやすい状態にする

やること

  • Bash設定ファイルの作成
  • Bash設定ファイルの編集

手順

  • ターミナルを起動し、以下コマンドを実行する。
touch ~/.bash_profile
touch ~/.bashrc
  • Finderでホームに移動し、[command] + [shift] + [.]で、隠しファイルを表示する。
  • .bash_profileをエディタ(テキストエディット等)で開き、.bashrcを呼び出すよう冒頭に記載する。
test -r ~/.bashrc && . ~/.bashrc

補足

  • 少し単純化して補足説明します。macOSでは、ターミナル起動時にログインシェルが実行され、ホームディレクトリ内の.bash_profileが読み込まれます。ターミナル上でコマンドbashを実行すると、非ログインシェルが実行され、ホームディレクトリ内の.bashrcが読み込まれます。このとき、環境変数は実行元から実行先へと引き継がれます。エイリアス等は引き継がれません。

  • 以上をふまえると、以下とするのがスマートだと考えられます。

    • 環境変数は、.bash_profileのみに記載する
    • エイリアスの定義、シェル関数の定義、コマンドライン補完の設定は、.bashrcのみに記載する
    • .bash_profileから.bashrcを読み込むように記載する

参考サイト

手順2. Xcode、Command Line Toolsのインストール

目的

  • macOS上でビルドできるようにする

やること

  • Xcodeのインストール
  • Command Line Toolsのインストール

手順

  • App StoreからXcodeをインストールする。
  • ターミナルを起動し、コマンドsudo xcodebuild -licenseを実行する。
  • コマンドxcode-select --installを実行すると、ダイアログが出るので、インストールを選択する。

手順3. Homebrewのインストール

目的

  • macOSにソフトウェアを簡単にインストールできるようにする

やること

  • Homebrewのインストール

手順

手順4. pyenvのインストール

目的

  • システムにプリインストールされているPythonとは別に、開発用のPythonをインストールできるようにする

やること

  • pyenvのインストール
  • Homebrewの、pyenvに対する警告に対処

手順

  • ターミナルを起動し、以下コマンドを実行する。
brew install pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc
source ~/.bash_profile
source ~/.bashrc
  • 以下コマンドを実行する。ただし、<ユーザ名>は、コマンドwhoamiの結果で置き換える。
whoami
brew doctor
echo 'alias brew="env PATH=${PATH/\/Users\/<ユーザ名>\/\.pyenv\/shims:/} brew"' >> ~/.bashrc
source ~/.bashrc
brew doctor

参考サイト

手順5. Anacondaのインストール

目的

  • サンドボックス化された、複数の環境を持てるようにする
  • 科学技術計算などを中心とした数多くのモジュールやツールをインストールする

やること

  • インストール可能なAnacondaのバージョンの確認
  • 最新版のAnacondaのインストール
  • コマンドcondaの機能拡張

手順

  • ターミナルを起動し、以下コマンドを実行する。
pyenv versions
pyenv install -l | grep anaconda
pyenv install anaconda<バージョン>
pyenv versions
echo '. ~/.pyenv/versions/anaconda<バージョン>/etc/profile.d/conda.sh' >> ~/.bashrc

参考サイト

手順6. ワークスペースの作成

目的

  • 開発物を体系的に管理できるようにする
  • カレントディレクトリがワークスペースのとき、開発用のPythonが有効になるようにする

やること

  • ワークスペース用のディレクトリの作成
  • ワークスペースにてpyenvのコマンドを実行

手順

  • ワークスペース用のディレクトリ(例:~/private/python/workspace)を作成する。
  • ターミナルを起動し、以下コマンドを実行する。
pyenv versions
python -V
cd <作成したワークスペース>
pyenv versions
python -V
pyenv local anaconda<バージョン>
pyenv versions
python -V

補足

  • python -Vと入力する際、間違えて小文字でpython -vと打つと、突如大量の文字列がターミナル上に表示され、戸惑うかもしれません。これは、結論的に言うと、何も問題ありません。単にpythonを対話モードで、かつverbose(冗長)オプション付きで起動したために起きる現象です。あせらず、quit()と入力し、対話モードを抜けてください。抜ける際にも、clearだのdestroyだのと言ってビビらせてくれますが、単に環境を閉じているだけなので、安心してください。

参考サイト

手順7. 仮想環境の作成

目的

  • ベースとなる環境とは別に、開発や実験用に、特定のパッケージをインストールした仮想環境を作成する

やること

  • 仮想環境の作成
  • TensorFlow、Kerasのインストール

手順

  • ターミナルを起動し、以下コマンドを実行する。
cd <ワークスペース>
pyenv versions
conda info -e
conda create -n <仮想環境名> --clone base
pyenv versions
conda info -e
conda activate <仮想環境名>
pyenv versions
conda info -e
conda update --all
conda install -c conda-forge tensorflow
conda install keras
conda deactivate

補足

  • TensorFlowKerasの公式サイトには、pipを用いてインストールするように指示がありますが、バージョン管理の一貫性の観点から、condaを用いてインストールする手順としました。

手順8. Jupyter Notebookの設定

目的

  • Jupyter Notebookから、仮想環境を選択できるようにする
  • グラフをインライン表示できるようにする
  • 作成したノートブックをLateX経由でPDFダウンロードできるようにする
  • プログラミングやマークダウンを快適に行えるようにする

やること

  • 仮想環境をJupyter Notebookのカーネルとして追加
  • iPythonのプロファイルを作成し、グラフインライン表示されるように設定
  • MacTexのインストール
  • PDFの図表表示位置を明示的に指定
  • 日本語等幅フォント(日本語と英語の幅が2:1のもの)のインストール
  • 背景色が黒基調となるようなスタイルシートのダウンロード、編集

手順

  • ターミナルを起動し、以下コマンドを実行する。
cd <ワークスペース>
jupyter kernelspec list
conda activate <仮想環境名>
ipython kernel install --user --name=<仮想環境名> --display-name=<Jupyter Notebook上での表示名>
jupyter kernelspec list
conda deactivate
  • ワークスペース内で、コマンドipython profile createを実行する。作成されたプロファイル(~/.ipython/profile_default/ipython_kernel_config.py)の最下行に以下を追加する。
## Setting to display graph inline
c.InteractiveShellApp.exec_lines = ['%matplotlib inline']
  • コマンドbrew cask install mactexを実行する。
  • ~/.pyenv/versions/anaconda<バージョン>/lib/python3.6/site-packages/nbconvert/templates/latex直下のbase.tplxを一箇所編集する。
    • PDFの図表が、次ページでなく、なるべくその場所に表示されるように指定(22行目と23行目の間、\usepackage{graphicx}の直下に、% set default figure placement to htbp以下の4行を追加)
〜中略〜
%===============================================================================
% Abstract overrides
%===============================================================================

((* block header *))
    ((* block docclass *))((* endblock docclass *))

    ((* block packages *))
    \usepackage[T1]{fontenc}
    % Nicer default font (+ math font) than Computer Modern for most use cases
    \usepackage{mathpazo}

    % Basic figure setup, for now with no caption control since it's done
    % automatically by Pandoc (which extracts ![](path) syntax from Markdown).
    \usepackage{graphicx}
    % set default figure placement to htbp
    \makeatletter
    \def\fps@figure{htbp}
    \makeatother
    % We will generate all images so they have a width \maxwidth. This means
    % that they will get their normal width if they fit onto the page, but
    % are scaled down if they would overflow the margins.
〜中略〜
  • Ricty Diminishedの公式サイトから、フォントファイル一式をダウンロードする。Font Bookを起動し、ダウンロードしたフォントファイルを追加する。
  • Oleg Levitsky氏のGitHub Gistよりcustom.cssをダウンロードし、~/.jupyter/custom/直下に保存する。保存したcssを三箇所編集する。
    • プログラミング用フォントのfont-family"Ricty Diminished"を追加(49行目)
    • プログラミング用フォントのfont-size10ptに変更(58行目)
    • ツールバーの非表示設定をコメントアウト(231行目)
〜(中略)〜
/* 
  SET THE CODE/MONOSPACE FONT 

  I prefer Bitsream Vera Sans Mono, which is freely downloadable here:
  http://www.dafont.com/bitstream-vera-mono.font
  However, there are plenty of alternatives at http://programmingfonts.org/
  in which case, add your preferred font to the stack below.
*/
〜(中略)〜
div.output pre,
div.output code,
.rendered_html pre,
.rendered_html code,
div.completions select,
div.container pre {
    font-family: "Ricty Diminished", "Bitstream Vera Sans Mono", Monaco, monospace;
}

div.output pre,
div.output code,
.rendered_html pre,
.rendered_html p code,
div.completions select,
div.container pre {
    font-size: 10pt;
}
〜(中略)〜
/* NOTEBOOK AND EDITOR INTERFACE */


/* comment out the following line to unhide the toolbar */

div#maintoolbar {
/*    display: none !important; */
}
〜(中略)〜

補足

  • 当初、jupyterthemesの利用も検討しました。コマンドでテーマを切り替えられる素晴らしいツールですが、プログラミングやマークダウン時に日本語等幅フォント(日本語と英語の幅が2:1のもの)を使えるようにすることがどうしてもできなかったので、別の手段をとることにしました。マークダウン時、日本語を含む表を作成する際に、罫線が揃うようにしたかったためです。スタイルシートの作者であるOleg Levitsky氏、および、その先人達に感謝します。
  • お気に入りの日本語等幅フォント(日本語と英語の幅が2:1のもの)があれば、そちらを利用しても構いません。フォントのファミリー名は、Font Bookで確認することができます。
  • PDFダウンロード時、図表が次ページに送られる現象を当初どうしても解決できませんでした。突破口となったのは、参考サイトの四つ目、@cawpea氏の投稿でした。氏の投稿を参考に、PandocのLaTeX用テンプレートを生成。Jupyter NotebookのMarkdownをコマンドpandocでテンプレートを用いてLaTeXに変換。通常版とDIFFをとることにより、ようやく必要な設定が見えてきた次第です。深く感謝します。

参考サイト

手順9. 日本語まわりの設定

目的

  • 作成したノートブックをLateX経由でPDFダウンロードする際、日本語が出力されるようにする
  • グラフのタイトルやラベルに、日本語が表示されるようにする

やること

  • LaTeX関連ファイルの作成、編集
  • iPythonのプロファイルの編集、キャッシュのクリア

手順

  • ターミナルを起動し、以下コマンドを実行する。
mkdir -p ~/texmf/tex/latex/local
touch ~/texmf/tex/latex/local/jalinebreak.sty
  • 作成された設定ファイル(jalinebreak.sty)に以下(日本語の段落を右端で折り返す設定)を記載する。
\XeTeXlinebreaklocale "ja"
\XeTeXlinebreakskip=0pt plus 1pt
\XeTeXlinebreakpenalty=0

\def\<{\@ifstar{\zx@hwback\nobreak}{\zx@hwback\relax}}
\def\zx@hwback#1{\leavevmode#1\hskip-.5em\relax}
  • ~/.pyenv/versions/anaconda<バージョン>/lib/python3.6/site-packages/nbconvert/templates/latex直下のbase.tplxを二箇所編集する。
    • フォントを指定する設定、段落のインデントを行う設定、jalinebreak.styを読み込む設定を追加(16行目と17行目の間、\usepackage[T1]{fontenc}の直下に、% Settings for displaying Japanese以下の5行を追加)
    • 日本語フォントの指定を追加(175行目と177行目の間、\begin{document}の下に、% Settings for displaying Japanese以下の4行を追加)
〜中略〜
%===============================================================================
% Abstract overrides
%===============================================================================

((* block header *))
    ((* block docclass *))((* endblock docclass *))

    ((* block packages *))
    \usepackage[T1]{fontenc}
    % Settings for displaying Japanese
    \usepackage{fontspec}
    \setlength{\parindent}{11pt}
    \usepackage{indentfirst}
    \usepackage{jalinebreak}
    % Nicer default font (+ math font) than Computer Modern for most use cases
〜中略〜
((* block body *))
    \begin{document}

    % Settings for displaying Japanese
    \setmainfont[BoldFont=HiraginoSans-W5]{HiraMinProN-W3}
    \setsansfont{HiraginoSans-W5}
    \setmonofont{RictyDiminished-Regular}

    ((* block predoc *))
〜中略〜
  • iPythonのプロファイル(~/.ipython/profile_default/ipython_kernel_config.py)の最下行に以下を追加する。
## Settings for displaying Japanese
c.InlineBackend.rc = {
    'font.size': 11,
    'font.family': 'Osaka',
    'figure.figsize': (6.0, 4.0),
    'savefig.dpi': 80,
    'axes.titlesize': 12
}
c.InlineBackend.figure_formats = set(['png', 'retina'])
  • キャッシュ(~/.matplotlib/fontList.json)があれば、削除する。

補足

  • base.tplxの設定では、mainfontに明朝体、BoldFontにその太字、sansfontにゴシック体、monofontに等幅フォントを指定すると、市販の多くの書籍のような書体になります。お気に入りのフォントがあれば、そちらを利用しても構いません。フォントのPostScript名やファミリー名は、Font Bookで確認することができます。
  • 私にとってTeXまわりは未知の領域ですので、参考サイトの一つ目、@masa-ita氏の投稿に出会わなければ、ドツボにハマるところだったでしょう。御礼申し上げます。

参考サイト

手順10. GNU Core Utilitiesのインストール

目的

  • macOSにプリインストールされているBSD系コマンドを、よりメジャーなGNU/Linux系コマンドに置き換える

やること

  • GNU Core Utilitiesのインストール

手順

  • ターミナルを起動し、以下コマンドを実行する。
brew install coreutils
echo 'export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"' >> ~/.bash_profile
echo 'export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"' >> ~/.bash_profile
echo "alias ls='ls --color=auto'" >> ~/.bashrc
source ~/.bash_profile
source ~/.bashrc
  • 同様に、diffutils、colordiff、findutils、grepあたりをインストールしておく。コマンドbrew install <パッケージ名>でよい。追加すべきPATHがあれば、インストール後に注意事項(Caveats)として表示される。

参考サイト

手順11. 動作確認

目的

  • 正しく環境構築できていることを確認する

やること

  • Jupyter Notebookの背景色が白でなく黒基調であることの確認
  • Jupyter Notebookから仮想環境を選択できることの確認
  • Kerasが実行できることの確認
  • グラフがインライン表示され、ラベルに日本語が表示されていることの確認
  • マークダウンが日本語等幅フォントで行えることの確認
  • ノートブックをPDF形式でダウンロードでき、日本語が出力されていることの確認
  • GNU Core Utilitiesがインストールできていることの確認

手順

  • 以下コマンドで、Jupyter Notebookを起動し、背景色が白でなく黒基調であることを確認する。
cd <ワークスペース>
jupyter notebook
  • 新規ノートブックを作成し、このとき、作成した仮想環境を選択する。(選択できることを確認する。)

  • セルに以下のKerasコードを貼り付け、[shift] + [return]で実行する。実行できること、グラフが表示されること、および、グラフのラベルに日本語が表示されていることを確認する。

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils
from keras.layers import Dense
from keras.models import Model
import matplotlib.pyplot as plt


# 学習データを生成する関数
def binary_encode(i, num_digits):
    return np.array([i >> d & 1 for d in range(num_digits)])


# 正解ラベルを生成する関数
def fizz_buzz_encode(i):
    if   i % 15 == 0: return np.array([0, 0, 0, 1])
    elif i % 5  == 0: return np.array([0, 0, 1, 0])
    elif i % 3  == 0: return np.array([0, 1, 0, 0])
    else:             return np.array([1, 0, 0, 0])


# 訓練データ
NUM_DIGITS = 10
trX = np.array([binary_encode(i, NUM_DIGITS) for i in range(101, 2 ** NUM_DIGITS)])
trY = np.array([fizz_buzz_encode(i) for i in range(101, 2 ** NUM_DIGITS)])

# 検証データ
valX = np.array([binary_encode(i, NUM_DIGITS) for i in
                 range(2 ** NUM_DIGITS, 2 ** NUM_DIGITS + 100)])
valY = np.array([fizz_buzz_encode(i) for i in range(1, 101)])


# モデル
model = Sequential()
model.add(Dense(1000, input_dim=10, activation="relu"))
model.add(Dense(1000, activation="relu"))
model.add(Dense(4, activation="softmax"))
model.compile(loss='categorical_crossentropy', optimizer='adagrad', metrics=["accuracy"])
hist = model.fit(trX, trY, epochs=100, batch_size=128, validation_data=(valX, valY))


# 学習状況の可視化
acc = hist.history['acc']
val_acc = hist.history['val_acc']
plt.plot(range(100), acc, marker='.', label='訓練データ')
plt.plot(range(100), val_acc, marker='.', label='検証データ')
plt.legend(loc='best', fontsize=10)
plt.grid()
plt.xlabel('エポック')
plt.ylabel('正解率')
plt.show()


# バイナリのfizzbuzz変換
def fizz_buzz(i, prediction):
    return [str(i), "fizz", "buzz", "fizzbuzz"][prediction]


# モデルを1から100の整数に適用してみる
numbers = np.arange(1, 101)
teX = np.transpose(binary_encode(numbers, NUM_DIGITS))
teY = model.predict_classes(teX)
output = np.vectorize(fizz_buzz)(numbers, teY)
print (output)


# 正解
answer = np.array([])
for i in numbers:
    if i % 15 == 0: answer = np.append(answer, "fizzbuzz")
    elif i % 5 == 0: answer = np.append(answer, "buzz")
    elif i % 3 == 0: answer = np.append(answer, "fizz")
    else: answer = np.append(answer, str(i))
# print (answer)


# 正解率
evaluate = np.array(answer == output)
print ("正解率:" + str(np.count_nonzero(evaluate == True) / 100))
  • 新規にセルを追加し、タイプをMarkdownに切り替える。以下文字列を貼り付け、罫線が揃っていることを確認する。[shift] + [return]で表を描画する。
| 日本語と         | 英語が混じっても | 罫線が         | ずれない        |
|:-----------------|-----------------:|:--------------:|:---------------:|
| Even if Japanese | and English mix, | the ruled line | does not shift. |
| 日本語と         | 英語が混じっても | 罫線が         | ずれない        |
| Even if Japanese | and English mix, | the ruled line | does not shift. |
| 日本語と         | 英語が混じっても | 罫線が         | ずれない        |
  • Fileから、LaTex経由のPDF形式でダウンロードし、ダウンロードできること、日本語が出力されていることを確認する。

  • Notebookを保存し、閉じる。ブラウザを閉じる。ターミナルを[control] + [C]で停止する。

  • 新規にターミナルを起動し、コマンドlsを実行する。ホームディレクトリ内のディレクトリが紫色で表示されていることを確認する。コマンドbashを実行し、コマンドlsを実行する。ホームディレクトリ内のディレクトリが紫色で表示されていることを確認する。コマンドexitを二回実行し、ターミナルを閉じる。

補足

Kerasのコードは、参考サイトの一つ目で@cvusk氏の書かれたコードに、学習時の検証データによる検証を追加したものです。学習状況を可視化する部分は、参考サイトの二つ目を参考にさせて頂きました。それぞれ御礼申し上げます。

参考サイト

17
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
19