/var/log/soymsk

id:soy_msk


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

Homebrewで"failed to download"が頻発する件

Homebrewでいろいろインストールできない

homebrewで"failed to download"なエラーが頻発しており、lvすらもインストールできない始末。

これの原因がわかったのでメモ。 ついでにChromewikipediaを見ると"ERR_EMPTY_RESPONSE"になる件も原因は一緒だった。

解決

ESETのver5を使っているのだけどこれが原因だったらしい。ver6にアップデートしたら解決した。 ver6には無料でアップデートできる。

これは気づかない。。。

【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!

f:id:soy_msk:20150201204730p:plain

参考

graph-tool quick start

【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を使えば取得できる。

mingw-getでのMingwインストール

MinGWのインストール方法がいつの間にか変更されていた。

リポジトリを参照してパッケージ管理をするようになった。

とりあえず20111118版はアンチウィルスソフトにはじかれるので、以前のバージョンをインストールして、インストール段階で最新のレポジトリを参照するように変更して試してみよう。