ノート/ノート
訪問者数 1412      最終更新 2017-05-06 (土) 08:14:15

Pythonの開発環境

pyenvとvirtualenv

Python開発環境の大きな問題として、Python2とPython3のバージョンの違いがある。

おそらく本来ならPython3へ移行して終わり(ピリオド)だったのだろうが、Python2で開発されたコードがPython3で動かない(修正を要する)ことがあり、移行は中途半端である。 つまり、Python2で書かれたプログラムを持ち込んで使う・改造する場合、Python2の環境が必要になる。一方で一部のソフトやライブラリはPython3のみに対応するので、Python3の環境が必要になる。

というわけで、Python2と3の両方の環境を(プロジェクトごとに)使い分けることになる。これはかなり厄介な作業になる。

これに加えて、Pythonの場合には(他の言語でも同様とは思うが)ライブラリをインストールした環境でプログラムを実行することになるが、ライブラリのコンフリクトが起こり得ること、同じような機能のライブラリが複数ああってしかし微妙に機能が違うために使い分けたいことがあること、などの理由から、プロジェクトごとに導入するライブラリセットを変えた環境が欲しくなる。

というわけで、

と思えばいいらしい。

以下、参照したページ

それぞれの元は、
Simple Python version management
Virtualenv — virtualenv 15.0.2 documentation

pyenv+virtualenvのLinuxへのインストール

Centos7

Centos7へインストールする参考ページは、たとえば

Ubuntuへインストールする参考ページは、たとえば

まず、必要なライブラリをインストール。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を使う

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を使う

いろいろできるようだが、プロジェクトとディレクトリを対応させて、そのディレクトリごとに異なる環境を割り当てる方法が、使いやすいようだ。

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)

pythonのインタラクティブ実行環境としてipythonがあるが、更にそれをブラウザ上で実行できるようにするツールが、Jupyter(旧称Notebook)と思ってよいらしい。

参考にしたページ

いいところは、ブラウザ上なので、リモートからの使い勝手が良いことである。

一方で、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)をリモートから使う
を参照。具体的には

画面をpdfに書き出すために、pandoc というパッケージが必要らしい。 Ubuntuの場合は ダウンロードのページ から pandoc-1.xxxx.deb をダウンロードし、サーバー上で

dpkg -i pandoc-1.17.2-1-amd64.deb

のようにしてインストールする。CentosとかRPMベースのインストールには alien コマンドを使えと書いてある。
さらに、pdflatexがない、と怒ったので、

apt-get install texlive-latex-base

としてインストールする。Centos上ではどうするか未確認。
これでも、pdfプリントはダメ。フォントが無いらしい。

ここまでできている環境で、起動は、

jupyter notebook &

その上で、手元Windows上のブラウザ上で、URL = http://localhost:8888 を開く。 うまくいけば、Jupyterの画面が開く。

終了時にセーブされた ***.ipynb ファイルを、次回開始時に開くと、終了時の状況から再開できる。

Jupyter notebookのコメント(マークダウン)機能を使ってメモやプレゼンを作る

マークダウンの説明


文法の要約


メモを書く・プレゼンを作る

Graphvisが必要(chainerで)

インストールはyumでOK.

Graphvizの使い方メモ

Graphvizとdot言語でグラフを描く方法のまとめ

エラー

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オプションつけて再コンパイルしろよ」と怒られた時にやった対処メモ を試してみる。

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

これでよかったみたい。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-05-06 (土) 08:14:15 (24d)