Mac OS X El Capitan にpyenv, pyenv-virtualenv, jupyterを入れて環境構築する話.

Install pyenv, pyenv-virtualenv

$ brew install pyenv pyenv-virtualenv

Install python and create virtual environment

$ PYTHON_CONFIGURE_OPTS="--enable-unicode=ucs2 --enable-framework=$(pyenv root)/versions/2.7.11" pyenv install 2.7.11
$ pyenv virtualenv 2.7.11 tech

PYTHON_CONFIGURE_OPTS=”–enable-unicode=ucs2″をつけないと,あとでjupyter notebookでエラーになる↓
参考:http://qiita.com/sigmalogneko/items/b5c15f5229387bbfd53a

(test) foo-mbp:test foo$ jupyter notebook
Traceback (most recent call last):
  File "/Users/foo/.pyenv/versions/test/bin/jupyter-notebook", line 7, in <module>
    from notebook.notebookapp import main
  File "/Users/foo/.pyenv/versions/2.7.10/envs/test/lib/python2.7/site-packages/notebook/notebookapp.py", line 30, in <module>
    from zmq.eventloop import ioloop
  File "/Users/foo/.pyenv/versions/2.7.10/envs/test/lib/python2.7/site-packages/zmq/__init__.py", line 66, in <module>
    from zmq import backend
  File "/Users/foo/.pyenv/versions/2.7.10/envs/test/lib/python2.7/site-packages/zmq/backend/__init__.py", line 40, in <module>
    reraise(*exc_info)
  File "/Users/foo/.pyenv/versions/2.7.10/envs/test/lib/python2.7/site-packages/zmq/backend/__init__.py", line 27, in <module>
    _ns = select_backend(first)
  File "/Users/foo/.pyenv/versions/2.7.10/envs/test/lib/python2.7/site-packages/zmq/backend/select.py", line 27, in select_backend
    mod = __import__(name, fromlist=public_api)
  File "/Users/foo/.pyenv/versions/2.7.10/envs/test/lib/python2.7/site-packages/zmq/backend/cython/__init__.py", line 6, in <module>
    from . import (constants, error, message, context,
ImportError: dlopen(/Users/foo/.pyenv/versions/2.7.10/envs/test/lib/python2.7/site-packages/zmq/backend/cython/constants.so, 2): Symbol not found: _PyUnicodeUCS2_DecodeUTF8
  Referenced from: /Users/foo/.pyenv/versions/2.7.10/envs/test/lib/python2.7/site-packages/zmq/backend/cython/constants.so
  Expected in: flat namespace
 in /Users/foo/.pyenv/versions/2.7.10/envs/test/lib/python2.7/site-packages/zmq/backend/cython/constants.so

こうなってしまったら,

$ pyenv uninstall 2.7.10
$ PYTHON_CONFIGURE_OPTS="--enable-unicode=ucs2" pyenv install 2.7.10

でやりなおし

また,PYTHON_CONFIGURE_OPTS=”–enable-framework=$(pyenv root)/versions/2.7.11″はPythonをフレームワークモード(?)で動作させるためのオプション.これをやらないとmatplotlibがうまく動かない.バージョン番号は適宜変える.
virtual envを使っている場合はどのみちうまくいかないが(後述)

Use virtual environment

pyenv activate tech

Install jupyter

pip install jupyter

Matplotlib

iPython Notebook上で

import matplotlib.pyplot

すると,エラーになる.

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-1-c845eb879342> in <module>()
     19 
     20 sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath('__file__')))))
---> 21 import handcraft_feature_extractor
     22 #import text2vec
     23 import config

/Users/foo/codes/pksha/chatbot-base/handcraft_feature_extractor.py in <module>()
      1 #!/usr/bin/env python
      2 # -*- coding: utf-8 -*-
----> 3 from feature_extractor import FeatureExtractor
      4 import MeCab
      5 import config

/Users/foo/codes/pksha/chatbot-base/feature_extractor.py in <module>()
      3 import matplotlib
      4 import numpy as np
----> 5 import matplotlib.pyplot as plt
      6 import MeCab
      7 import re, pprint

/Users/foo/.pyenv/versions/2.7.9/envs/pksha/lib/python2.7/site-packages/matplotlib/pyplot.py in <module>()
    112 
    113 from matplotlib.backends import pylab_setup
--> 114 _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
    115 
    116 _IP_REGISTERED = None

/Users/foo/.pyenv/versions/2.7.9/envs/pksha/lib/python2.7/site-packages/matplotlib/backends/__init__.pyc in pylab_setup()
     30     # imports. 0 means only perform absolute imports.
     31     backend_mod = __import__(backend_name,
---> 32                              globals(),locals(),[backend_name],0)
     33 
     34     # Things we pull in from all backends

/Users/foo/.pyenv/versions/2.7.9/envs/pksha/lib/python2.7/site-packages/matplotlib/backends/backend_macosx.py in <module>()
     22 
     23 import matplotlib
---> 24 from matplotlib.backends import _macosx
     25 
     26 

RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are Working with Matplotlib in a virtual enviroment see 'Working with Matplotlib in Virtual environments' in the Matplotlib FAQ

http://matplotlib.org/faq/virtualenv_faq.html
を参考に,

PATHTOENV/bin/frameworkpythonを作成し,実行権限付与

#!/bin/bash

# what real Python executable to use
PYVER=2.7
PATHTOPYTHON=/usr/bin/
PYTHON=${PATHTOPYTHON}python${PYVER}

# find the root of the virtualenv, it should be the parent of the dir this script is in
ENV=`$PYTHON -c "import os; print os.path.abspath(os.path.join(os.path.dirname(\"$0\"), '..'))"`

# now run Python with the virtualenv set as Python's HOME
export PYTHONHOME=$ENV
exec $PYTHON "$@"
$ chmod +x ~/.pyenv/versions/tech/bin/frameworkpython

この状態で

$ frameworkpython -m IPython notebook

でIPython Notebookを起動すると,import matplotlib.pyplotが動く.
frameworkpythonで,使用するpythonをsystemのものに置き換えている?
なので,今回の例にかぎらず,virtualenvのPythonを使うせいでエラーになっているっぽい問題に遭遇したら,代わりにframeworkpythonで実行してみるとよい.

しかし,

$ frameworkpython -m jupyter notebook

だとうまくいかない.
気持ち悪いのでなんとかしたい.

http://www.wirywolf.com/2016/01/pyplot-in-jupyter-inside-pyenv-on-el-capitan.html
を参考に,

$ jupyter --paths
config:
    /Users/foo/.jupyter
    /Users/foo/.pyenv/versions/2.7.9/envs/pksha/etc/jupyter
    /usr/local/etc/jupyter
    /etc/jupyter
data:
    /Users/foo/Library/Jupyter
    /Users/foo/.pyenv/versions/2.7.9/envs/pksha/share/jupyter
    /usr/local/share/jupyter
    /usr/share/jupyter
runtime:
    /Users/foo/Library/Jupyter/runtime

data:の一番目,/Users/foo/Library/Jupyterの下に新しくKernelを定義する.

$ mkdir -p ~/Library/Jupyter/kernels/matplotlib
$ vi ~/Library/Jupyter/kernels/matplotlib/kernel.json
{
 "argv": [ "/Users/foo/.pyenv/versions/tech/bin/frameworkpython", "-m", "ipykernel",
          "-f", "{connection_file}"],
 "display_name": "matplotlib",
 "language": "python"
}

これで,matplotlibという名前でKernelが定義された.

普通にjupyter notebookを実行して,
Jupyter Notebook上で作業するときに,Kernelをmatplotlibにしてやればよい.

广告
将在 10 秒后关闭
bannerAds