[[ノート/ノート]]~
訪問者数 &counter(); 最終更新 &lastmod();
*Pythonの開発環境 [#o6ea355f]
**pyenvとvirtualenv [#y156a8de]
Python開発環境の大きな問題として、Python2とPython3のバージョンの違いがある。
おそらく本来ならPython3へ移行して終わり(ピリオド)だったのだろうが、Python2で開発されたコードがPython3で動かない(修正を要する)ことがあり、移行は中途半端である。
つまり、Python2で書かれたプログラムを持ち込んで使う・改造する場合、Python2の環境が必要になる。一方で一部のソフトやライブラリはPython3のみに対応するので、Python3の環境が必要になる。
というわけで、Python2と3の両方の環境を(プロジェクトごとに)使い分けることになる。これはかなり厄介な作業になる。
これに加えて、Pythonの場合には(他の言語でも同様とは思うが)ライブラリをインストールした環境でプログラムを実行することになるが、ライブラリのコンフリクトが起こり得ること、同じような機能のライブラリが複数ああってしかし微妙に機能が違うために使い分けたいことがあること、などの理由から、プロジェクトごとに導入するライブラリセットを変えた環境が欲しくなる。
というわけで、
-pyenv ⇒ 前者に言う、「同一システム内でプロジェクトによって異なるバージョンのPythonを使うことができる」ようにする仕組み
-virtualenv (2017-04-25追加) ⇒ 前者に言う、「同一バージョンの異なる Python 環境(仮想環境、などと呼ぶ)を管理する ためのツール」
-pyenv+virtualenv ⇒ 後者に言う、「同一システム内でプロジェクトによって異なるライブラリ環境を使うことができる」ようにする仕組み~
%%別の説明によると、%%~
-pyenv-virtualenv ⇒ 前者に言う、「pyenv をより便利に使用するため」の「pyenvはPython環境の名前空間がバージョン番号のみだったのに対し、(pyenv-virtualenvは)任意の文字列を利用することが可能になるpyenvプラグイン」であり、後者に言う「Pythonのバージョン番号だけでなく、任意の文字列(?)について異なる環境を使うことができる」と言っている。この任意の文字列がプロジェクト名(というか、ディレクトリ名)になる。
と思えばいいらしい。
以下、参照したページ
-%%[[Pyenvとvirtualenv pluginによるPython環境を構築する:http://blog.ieknir.com/blog/pyenv-with-virtualenv/]]%% << サイトが無くなっている
-[[[Python]pyenvとvirtualenvとpyenv-virtualenv:http://dackdive.hateblo.jp/entry/2015/12/12/163400]] <<< お勧め
-[[Pythonの仮想環境構築(2017年版) pyenvとpyenv-virtualenvとvirtualenvとvirtualenvwrapperとpyvenvとvenv:http://qiita.com/maskedw/items/aaa2fd7abfd493cf2820]]
それぞれの元は、~
[[Simple Python version management:https://github.com/yyuu/pyenv]]~
[[Virtualenv — virtualenv 15.0.2 documentation:https://virtualenv.pypa.io/]]
**pyenv+virtualenvのLinuxへのインストール [#laea0f44]
Centos7
Centos7へインストールする参考ページは、たとえば
-[[pyenv + virtualenv (CentOS7):http://qiita.com/saitou1978/items/e82421e29e118bd397cc]]
-[[CentOSにpyenvをインストールする方法:http://www.task-notes.com/entry/20151206/1449378009]]
Ubuntuへインストールする参考ページは、たとえば
-[[Ubuntuにpyenvを用いてpythn環境を構築しました:http://www.takunoko.com/blog/ubuntu%E3%81%ABpython%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82/]]
-
まず、必要なライブラリをインストール。Centos7ではこんな感じらしい。
sudo yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel
Ubuntuではこんな感じ。
sudo apt-get install git gcc g++ make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
次に、pyenvをインストール~
%%pyenv自体をgit cloneで持ってくる。ここからは両linuxとも共通(当然)、ここから一般ユーザ権限で。%%
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
exec $SHELL -l
pipでインストールできる。pipがあるという前提で、
pip install pyenv
一応、確認のため、pyenvの下でどんな環境がインストール可能かリストコマンドで見てみる
pyenv install -l
次に、virtualenvをインストール (単独でvirtualenvを使うときのため)~
%%virtualenv自体を、git cloneで持ってくる。%%
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
exec $SHELL -l
pipでインストールできる。pipがあるという前提で、
pip install virtualenv
***pyenvを使う [#qf0423c0]
pyenv下に使いたいpythonのバージョンをインストール、またはanacondaのバージョンをインストール~
pyenv install 2.7.12 ← pythonをインストールするときはバージョン番号だけ
pyenv install 3.5.2
インストールできるバージョン番号は、
pyenv install -l
で確認。また、
pyenv versions
で手元マシンにあるpyenvの名前(pythonバージョン番号もしくは自分で付けた環境名)確認。
たとえば、python3.6.0a1やanaconda2-4.1.0を準備したければ
pyenv install 3.6.0a1
pyenv install anaconda2-4.1.0
などとしてインストールする。
で、インストールしたら最後に、
pyenv rehash
をしておくとよい
pyenvのみを使っていて、pythonのデフォルトで使えるバージョンを切り替えたいときのコマンドは
pyenv global 2.7.12
もともとシステムに入っているpythonを使いたいときは
pyenv global system
現在ディレクトリ下での環境として設定したければ
pyenv local 2.7.12
***pyenv-virtualenvを使う [#kd64407d]
いろいろできるようだが、プロジェクトとディレクトリを対応させて、そのディレクトリごとに異なる環境を割り当てる方法が、使いやすいようだ。
pyenv-virtualenvをインストールする
pip install pyenv-virtualenv
まず、pyenvで、新しい環境名を作る
pyenv virtualenv anaconda3-4.1.0 my-env
プロジェクトに対応したディレクトリを作る
mkdir my-env
cd my-env
ここで使いたい環境名をlocalとして設定する
pyenv local my-env
更に、この環境内で使いたいpythonのライブラリを、pipコマンドでインストールすることができる。
仮想環境を削除するには
pyenv uninstall my-env
仮想環境を表示するには
pyenv versions
pyenv virtualenvs
----------
**Jupyter (Notebook) [#s140b758]
pythonのインタラクティブ実行環境としてipythonがあるが、更にそれをブラウザ上で実行できるようにするツールが、Jupyter(旧称Notebook)と思ってよいらしい。
参考にしたページ
-[[Jupyter Notebook(IPython)のインストールと始め方:http://www.task-notes.com/entry/20151129/1448794509]]
-[[Jupyter (iPython) Notebookを使って技術ノート環境を構築する方法:http://myenigma.hatenablog.com/entry/2016/02/20/183423]]
いいところは、ブラウザ上なので、リモートからの使い勝手が良いことである。
一方で、Python実行ホスト側にJupyterのWebサーバー(JupyterがWebサーバーそのものとして動くと思えばいい)を置くので、80番とは異なるポート(たとえば8080番)でサーバーをアクセスできるように設定しなければならない。ファイヤウォール等が間に入っていると、そこを回避する手段(VPNなど)を設定しなければならない点が、面倒といえば面倒である。
研究室環境では、Pythonを使いたいlinuxサーバー自身がファイヤウォールを持っているのでそれを出られるようにする必要がある。それに加えて、大学の出口でファイヤウォールによってポート規制がかかっているので、たとえばSSHのポートフォワードを使ったVPN設定が必要になる。
jupyterのインストールは、pipコマンドで容易に行える(かなりいろいろなdependencyをインストールするが)。
pip install jupyter
SSH経由のVPNの設定は、TeraTermの場合は次のようにする。~
~
まずTeraTermでセッションを開いてしまう。~
設定タブでSSH転送を選び、ポート転送に対して「追加」で、~
ローカルのポート指定の側で、ローカルのポート8888、リモート側ホスト、(リモート)ポート8888を指定する。~
このセッションが生きている間、ポート転送する。
また、ブラウザからログインするための設定が必要で、たとえば~
[[ipython notebook(jupyter)をリモートから使う:http://qiita.com/Himaken/items/b411de87b00c051e6697]]~
を参照。具体的には
-notebook_config.pyファイルの生成
jupyter notebook --generate-config
これで、configファイル ~/.jupyter/jupyter_notebook_config.py ができる。次に
-configファイルを編集する。ファイルの最後に下記を追加する。~
c.IPKernelApp.pylab = 'inline'
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888
c.NotebookApp.password = u'sha1:XXXXXXX(#パスワードのハッシュ値を記載)'
但し、パスワードのハッシュ値は、たとえばpythonを使って~
from IPython.lib import passwd
passwd()
を実行すれば、sha1:XXXXXXX が生成される。
画面をpdfに書き出すために、[[pandoc:http://pandoc.org/installing.html]] というパッケージが必要らしい。 Ubuntuの場合は [[ダウンロードのページ:https://github.com/jgm/pandoc/releases/latest]] から pandoc-1.xxxx.deb をダウンロードし、サーバー上で
dpkg -i pandoc-1.17.2-1-amd64.deb
のようにしてインストールする。CentosとかRPMベースのインストールには [[alien:http://itpro.nikkeibp.co.jp/atcl/column/14/230520/072800002/]] コマンドを使えと書いてある。~
さらに、pdflatexがない、と怒ったので、
apt-get install texlive-latex-base
としてインストールする。Centos上ではどうするか未確認。~
これでも、pdfプリントはダメ。フォントが無いらしい。
ここまでできている環境で、起動は、
jupyter notebook &
その上で、手元Windows上のブラウザ上で、URL = http://localhost:8888 を開く。
うまくいけば、Jupyterの画面が開く。
終了時にセーブされた ***.ipynb ファイルを、次回開始時に開くと、終了時の状況から再開できる。
**Jupyter notebookのコメント(マークダウン)機能を使ってメモやプレゼンを作る [#o5010e73]
マークダウンの説明
-[[大元のドキュメント:http://jupyter-notebook.readthedocs.io/en/latest/examples/Notebook/Working%20With%20Markdown%20Cells.html]] を参照
-[[便利な解説1:https://gist.github.com/wate/7072365]]
-[[便利な解説2:http://kojika17.com/2013/01/starting-markdown.html]]
------------------------------------------
文法の要約
-見出し ⇒ #、##、### (空白を付けること)
-リスト ⇒ -、*、+ (同上)。 入れ子には段下げ?
-番号付きリスト ⇒ 1. 2. 3. … で始める(ピリオド+空白を付けること)
-リンク ⇒ [書きたいテキスト](リンク先のURL)
-罫線(/hr) ⇒ 3つ以上の*(アスタリスク), -(ハイフン), _(アンダースコア)と半角スペースのみの行
-------------------------------------------
メモを書く・プレゼンを作る
-[[Jupyter (iPython) Notebookを使って技術ノート環境を構築する方法:http://myenigma.hatenablog.com/entry/2016/02/20/183423]]
-[[Jupyter (iPython) Notebookを使ってプレゼンテーション資料を作る方法:http://myenigma.hatenablog.com/entry/2016/05/22/160209]] ブラウザで表示、そのために、reveal.js が必要
**Graphvisが必要(chainerで) [#re30d207]
インストールはyumでOK.
[[Graphvizの使い方メモ:http://d.hatena.ne.jp/ksmemo/20071011/p1]]
[[Graphvizとdot言語でグラフを描く方法のまとめ:http://qiita.com/rubytomato@github/items/51779135bc4b77c8c20d]]
*エラー [#t811c587]
theanoを含むpythonを実行しようとしたら、エラーが出た。(theanoはpipでインストール成功済み)
Problem occurred during compilation with the command line below:
/usr/bin/g++ -shared -g -march=core-avx2 -mcx16 -msahf -mmovbe -mno-aes
-mpclmul -mpopcnt -mabm -mno-lwp -mfma -mno-fma4 -mno-xop -mbmi -mbmi2
-mno-tbm -mavx -mavx2 -msse4.2 -msse4.1 -mlzcnt -mno-rtm -mno-hle -mrdrnd
-mf16c -mfsgsbase -mno-rdseed -mno-prfchw -mno-adx -mfxsr -mxsave -mxsaveopt
-mno-pku --param l1-cache-size=32 --param l1-cache-line-size=64
--param l2-cache-size=46080 -mtune=generic
-DNPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION -m64 -fPIC
-I/home/yamanouc/.pyenv/versions/testchainer/lib/python3.5/site-packages/numpy/core/include
-I/home/yamanouc/.pyenv/versions/3.5.1/include/python3.5m
-I/home/yamanouc/.pyenv/versions/testchainer/lib/python3.5/site-packages/theano/gof -L/home/yamanouc/.pyenv/versions/3.5.1/lib
-fvisibility=hidden -o /home/yamanouc/.theano/compiledir_Linux-3.10-el7.x86_64-x86_64-with-centos-7.3.1611-Core-x86_64-3.5.1-64/lazylinker_ext/lazylinker_ext.so
/home/yamanouc/.theano/compiledir_Linux-3.10-el7.x86_64-x86_64-with-centos-7.3.1611-Core-x86_64-3.5.1-64/lazylinker_ext/mod.cpp
-lpython3.5m
/usr/bin/ld:
/home/yamanouc/.pyenv/versions/3.5.1/lib/libpython3.5m.a(abstract.o):
再配置 R_X86_64_32S (`_Py_NotImplementedStruct' に対する) は共有オブジェクト
作成時には使用できません。-fPIC を付けて再コンパイルしてください。
/home/yamanouc/.pyenv/versions/3.5.1/lib/libpython3.5m.a: error adding symbols: 不正な値です
collect2: エラー: ld はステータス 1 で終了しました
これに対して、[[TheanoをpyenvでインストールしたPython3.4.2で動かそうとしたら「PICオプションつけて再コンパイルしろよ」と怒られた時にやった対処メモ:http://qiita.com/sobeit@github/items/74ae8eb5bfc1c445016a]] を試してみる。
env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.5.1
pyenv: /home/yamanouc/.pyenv/versions/3.5.1 already exists
continue with installation? (y/N) y
Installing Python-3.5.1...
Installed Python-3.5.1 to /home/yamanouc/.pyenv/versions/3.5.1
これでよかったみたい。