Pythonにおける仮想環境構築ツール
Pythonの仮想環境ツールがいろいろありすぎて混乱するので、整理目的で調査してみる。 ざっと調べた感じでは以下のとおり。
Pyenv
複数バージョンのPythonバイナリを管理するもの。プロジェクト(ディレクトリ)単位での異なるバージョンのPythonが使用できるようになる。 ただし、コレ単体だとバージョンごとのsite-packagesは同じなので、例えばプロジェクトAとプロジェクトBで同じバージョンのPythonを使っていると、ライブラリも共有せざるを得ない。
Virtualenv
Pythonの仮想環境を作成するもの。プロジェクトごとにsite-packagesを分けることができる。Pyenvと違い、コレ単体ではPythonバイナリのバージョンは分けられないが、ライブラリは分けることができる。
pyenv-virtualenv
Pyenvのvirtualenvプラグイン。PyenvでPython本体のバージョン管理をしつつ、Virtualenvでライブラリの管理もできる。だいたいこれが使われているらしい。
Pyvenv
python3.3で追加された。これ自体は単なるvenvのラッパーらしい。venvではPythonバイナリのバージョンとsite-packagesディレクトリの管理ができる。ただし、バイナリの管理はすでにインストールされているバイナリに固定されているだけなので、バイナリのバージョン管理ができると言えるかどうか。。これ単体で使うくらいならpyenv-virtualenvをつかっておいた方がいいかも。ツール自体もPython3に依存しているのでPyvenvを使う場合は、まずはPython3.4を入れる必要がある。
まとめ
とりあえずpyenv-virtualenvをつかっておけば問題なさそう。 Python3.3以降を使う、かつバイナリのバージョンにはそれほど細かい管理は不要というのであれば、Pyvenvもいいかもしれない。
更新(2016/02/04)
記事を書いてからいくつかPythonで開発をしているけど、今のところpyenv-virtualenvでpython2も3も問題なし!
Unite.vimのfile source挙動の変更について
file sourceを開いた時に、これまではデフォルトでカレントディレクトリが入力された状態であったが、下記のコミットでこれができなくなってしまった。
どうすればいいんだろう
https://github.com/Shougo/unite.vim/commit/0d8336a4e6036f6100050fa0455896ac58ed833f?diff=split
【Pythonでネットワーク可視化】graph-toolのインストール
graph-tool
前回NetworkXを使ってグラフを描画したが、主に使用目的がpythonでのデータの可視化であったので、それに特化したライブラリを探していた。
そこで見つけたのがgraph-tool。graph-toolはデータビジュアライゼーションに特化したライブラリとのことで、早速使ってみる。 今回はインストールと簡単なグラフ描画まで。
インストール for Ubuntu(14.04)
/etc/apt/sources.listに以下の文を追加
deb http://downloads.skewed.de/apt/trusty trusty universe deb-src http://downloads.skewed.de/apt/trusty trusty universe
他のversionのubuntuを使用している場合はtrustyの部分を変える必要が有ることに注意。今回は(14.04, trusty)なのでtrustyと書き換える。
ところがapt-get updateした段階でpublic keyのエラーがでてしまった。 どうやらpublic keyを登録しないといけないらしい。 公式サイト からpublic keyをダウンロードし登録して解決。
apt-key add [downloadしたpublic keyのパス] apt-key list # 確認 apt-get update # OK!
keyの登録ができれば、あとは下記コマンドでインストールできるはず。
apt-get install python-graph-tool
インストール for Mac
以前はいろいろ大変だったらしいが、今ではパッケージマネージャ経由でインストールできる。 Macportsだと簡単で
port install py-graph-tool
だけでインストール可能とのこと。
手元の環境ではHomebrewを使っているので、今回はbrewで試してみる。 かなり長いインストール手順が書いてあったが、幸いbrewのフォーミュラがあったのでそれを実行。
$ brew install homebrew/science/graph-tool
インストールはかなり時間がかかるので注意。 コマンドを実行してしばらく放置する。
必要なpythonライブラリのインストール
上記手順でnumpy, matplotlib, scipyを手動でインストールしろ、というメッセージが出たので、pipでインストール
$ pip install numpy scipy matplotlib
そして再度brewコマンドを実行。手元のMacBookPro(2014 2.4GHz)で30分ほどかかった。
>>> import graph_tool
Fatal Python error: PyThreadState_Get: no current thread
失敗orz... 調べたところどうやらbrew でboostが複数バージョンインストールされていることが原因らしいので、boostを再インストール
brew uninstall --force boost brew install boost
再度graph_toolのインスト-ルを行ったところ、無事終了。
>>> import graph_tool
>>>
インストールが完了した。
簡単なグラフ描画
2ノードの簡単なグラフを作成してみる
import graph_tool as gt import graph_tool.draw as gtd g = gt.Graph() # Add node v1 = g.add_vertex() v2 = g.add_vertex() # Add edge e = g.add_edge(v1,v2) # Draw graph gtd.graph_draw(g, vertex_text = g.vertex_index, vertex_font_size=18, output_size=(200, 200), output="two-nodes.png" )
以下のようなグラフが出力されればOK!
参考
【Pythonでネットワーク可視化】NetworkXを使ってみる
NetworkXを使ってみる
pythonで100万オーダーのノードを持つネットワーク図を作成したいので、調べてみたところNetworkXというものが使えそう。
NetworkXの準備
Macでの実行なので、pipをインストールしていればすぐにセットアップできる
sudo pip install networkx
簡単なサンプルの実行
まずは本家のチュートリアルを見つつ、NetworkXで簡単なグラフを描画してみる
まず空のグラフを生成
import networkx as nx G = nx.Graph() # 空のグラフ
ノードの追加
空のグラフにノードを追加していく
G.add_node(1) G.add_nodes_from([2,3]) # 複数のノードを一括追加
ハッシュ可能オブジェクトはノードとして追加できるので、数値だけじゃなく文字列、オブジェクトもノードとして扱える。 これは結構柔軟な使い方ができそう。
G.add_node((1, 2)) # tupleは追加可能 G.add_node([1, 2]) # listはhasableではないので不可
nodes関数でノードの一覧が出力される。
G.nodes() # [(1,2), 1, 2, 3] G.number_of_ndoes() # 4 G.clear() # 全ノードのクリア
エッジ(枝)の追加
# G.clear() G.add_edges_from([('a','b'), ('c','d')]) # a-b, c-d間のエッジを追加する。ノードも同時に追加される。 G.add_edge(('b', 'c')) G.edges() # [('a', 'b'), ('c', 'b'), ('c', 'd')]
グラフの描画
matplotlib経由でグラフの描画が可能
pos = nx.spring_layout(G) # グラフ形式を選択。ここではスプリングモデルでやってみる nx.draw(G, pos, with_labels=True) # グラフ描画。 オプションでノードのラベル付きにしている plt.show() # matplotlibでグラフ表示
plt経由でグラフの保存もできる。
ここまで調べてみて、NetworkX自体は図の描画よりもグラフ計算向けのライブラリらしい。(本家ドキュメントより)
グラフ描画もできるが、凝ったことをしたい場合は最適じゃない気がする。
とりあえずここまで。
モジュール内部からのカレントディレクトリの取得
実行スクリプトからモジュールを呼び出す場合、モジュール内部からモジュール本体のパスを取得する方法。
単純にos.getcwd()を使うと実行スクリプトのカレントディレクトリを取得してしまう。
呼び出しているモジュール中で、モジュールのカレントディレクトリを扱いたい場合、
inspectモジュールを使うTIPS。[From stackoverflow]
import inspect import os filename = inspect.getfile( inspect.currentframe() ) # module file name dirpath = os.path.dirname( inspect.getfile( inspect.currentframe() ) ) # module directory
絶対パスもabspathを使えば取得できる。