起動
Ipython
ターミナルにipython
と打ち込む。
または、cmder使っているので、タスク(win+alt+t)に以下を登録した。
cmd /k "%ConEmuDir%\..\init.bat" -new_console:d:%HOME%\python & ipython
init.bat
してから立ち上げると、shellコマンドとして!head
とか使える。
Jupyter qtconsole
ターミナルにjupyter qtconsole --style=monokai
--style=monokai
しなくてもいいけど、背景白のコンソールは見た目が残念なので、スタイルを変える。
ipythonのqtconsoleの色やフォントを設定する←この辺が詳しい。
cmderには
cmd /k "jupyter qtconsole --style=monokai" -new_console:t:"Jupyter" -new_console:b
または
"jupyter qtconsole --style=monokai" -new_console:b -new_console:d:%HOME%\python
Jupyter notebook
ターミナルにjupyter notebook
と打ち込む
cmderには
jupyter notebook -new_console:t:"Jupyter Notebook" -new_console:b
グラフの日本語表示
詳細はmatplotlib, seabornの日本語表示にも書いた。
以下は要約。
matplotlibの日本語表示
~/.matplotlib/matplotlibrc
を作成して、常時日本語フォントを使うようにする。
font.family : IPAMincho
seabornの日本語表示
C:\tools\Anaconda3\Lib\site-packages\seaborn\rcmod.pyのrcmod.py
のset関数のデフォルト値のfontを"sans-serif"から"IPAMincho"などに変更する。
...
def set(context="notebook", style="darkgrid", palette="deep",
font="IPAMincho", font_scale=1, color_codes=False, rc=None):
...
なお、これらの操作はIPAフォントなどを独立行政法人 情報処理推進機構あたりから事前にインストールしておく必要がある。
既にインストールしてある、MS明朝とかでも可能なはず。matplotlibrc内に書き込む名前がわからないので、知っている人は教えて下さい。
True type font(ttf)だからIPAフォントはpythonの日本語表示ができるらしい。Takaoフォントとかではできなかった。日本語化グラフ表示に使えるフォントは今のところIPAフォントしか知りません。
書き換えたら、~/.matplotlib/fontList.py3k.cache
といったキャッシュファイルも削除して再度matplotlib等をインポートすることで日本語フォントが適用される。←これ結構忘れがち
エイリアスとグラフ表示の修正
プロファイルを設定していなければ、プロファイルを作るべく、ターミナルに以下を入力。プロファイルの名前をつけることもできるが、のところを空欄にすれば"default"の名前が付けられる。
$ ipython profile create <name>
上のコマンドで生成された~\.ipython\profile_default\ipython_config.py
に以下を追加する。
c.AliasManager.user_aliases = [
# shell command
('ls', 'ls --show-control-chars -F --color'),
('grep', 'grep --color'),
('grepx', 'grep --color -nriC'),
('find', 'find . -name'),
# git
('g', 'git'),
('gf', 'git flow'),
# add,commit,push
('ga', 'git add'),
('gaa', 'git add .'),
('gan', 'git add -n .'),
('gaundo', 'git reset HEAD'),
('gc', 'git commit'),
('gac', 'git commit -am'),
('gcundo', 'git commit --amend'),
('gp', 'git push'),
('gpo', 'git push origin'),
# status
('gs', 'git status --short --branch'),
('gd', 'git diff --color-words'),
('gls', 'git ls-files'),
('gl', 'git log --oneline --all --graph --decorate'),
# branch
('gb', 'git branch'),
('gch', 'git checkout'),
('gm', 'git merge'),
('gt', 'git tag'),
]
c.InteractiveShellApp.exec_lines = ['%load_ext autoreload', '%autoreload 2']
c.InlineBackend.rc = {'font.family': 'IPAMincho',
'figure.facecolor': (1, 1, 1, 1),
'savefig.dpi': 72,
'figure.subplot.bottom': 0.125,
'figure.edgecolor': (1, 1, 1, 1)}
やっていること
-
c.AliasManager.user_aliases
: エイリアスを追加してipython shellを使いやすくする- lsやgrepのようなshellコマンド
- gitのコマンド
-
c.InteractiveShellApp.exec_lines
: ipython実行時に次のリスト内にあるマジックコマンドを実行 -
c.InlineBackend.rc
: グラフをインライン表示したときに、背景色とticksやタイトルがかぶってしまうのを防ぐ。
タイトルやticksが黒文字なので見えない。
こういうのがいやだ。
c.InlineBackend.rc
の設定を弄ってやると、グラフの色を透明から変更できる。
Ipython, Jupyterのスタートアップ
~\.ipython\profile_default\startup
ディレクトリに保存された.py, .ipyファイルはIpython, Jupyter 開いたときに自動実行される。
使用しているのは以下の二つ。
- 01_startup.ipy
- 02_inline.ipy
ちなみに実行されるときは名前順にソートされて実行されるので、
- startup.ipy
- inline.ipy
とするとinline.py
が実行されたのちstartup.py
が実行される。
startup.py
にmatplotlib
インポートが記述されているので、inline.py
を先にインポートするとインポートエラー。
ゆえにファイル名の先頭に数字01
, 02
を付けてstartup.py
が先に実行されるようにしている。
01_startup.ipy
モジュールのインポートを行う。
__modules__ = ('numpy',
'pandas',
'matplotlib.pyplot',
'seaborn')
__standfor__ = {'numpy': 'np',
'pandas': 'pd',
'matplotlib.pyplot': 'plt',
'seaborn': 'sns'}
for __module__ in __modules__:
__execution__ = 'import %s as %s' % (__module__, __standfor__[__module__])
print(__execution__)
exec(__execution__)
ipythonやjupyter立ち上げたときに、インポート中のモジュールを標準出力に出力しながら、numpy, pandas, matplotlib.pyplot, seaborn
をインポートしてくれる。
詳細はスタートアップ時にインポート中のモジュールを表示にも書いた。
02_inline.ipy
グラフのインライン表示を指示する。
__inline__ = 'matplotlib inline'
__gui__ = 'matplotlib auto'
try:
get_ipython().magic(__inline__)
print('%' + __inline__)
except:
get_ipython().magic(__gui__)
print('%' + __gui__)
print("If you'd like to use `plt.show()` command,")
print('you can type `plt.ioff()`/`plt.ion()` to turn interactive mode off/on.')
実行していることは、%matplotlib inline
を実行してみて、エラーが出たら%matplotlib auto
を実行する。autoはデフォルトで開くqt5などのGUIアプリケーションでグラフを開く。(要はデフォルトの動作を行う。)
エラーはコンソール出力できないIpython上などでinline表示をしようとすると、以下のようなUnknownBackend
というエラーが返される。
UnknownBackend: No event loop integration for 'inline'.
Supported event loops are: qt, qt4, qt5, gtk, gtk2, gtk3, tk, wx, pyglet, glut, osx
plt.show()を再び使いたいときの説明メッセージ
If you use `plt.show()` command,
you should use `plt.ioff()` to turn interactive mode off.
は即座にplotするモードを終了させて、plt.show()
による描画に戻したいときはplt.ioff()
と打ってください、って意味。
更新 2016/11/13
__hogehoge__
のように変数をアンダーバー二つでくくると外部から見えなくなる。
影響ないと思うけど、後になって「指定した覚えのないmoduleとかstandforとかいう変数ナンダ???」ってならないようにする措置。
inline.ipy動作時の注意点
ipythonの場合
plt.<コマンド>
を打つと即座にグラフが表示される
plotをいくつか重ねたい場合、plt.ioff()
を打つと、対話モードが終了し、plt.show()
を打たないとqt5にグラフ表示されない、通常の状態に戻る。
jpython qtconsoleの場合
ipythonと同様にplt.<コマンド>
で即座に表示される
jupyter qtconsoleはplt.ioff()
をしてもプロットが重なってくれない
グラフの作り方として、バックスラッシュを続けて、コマンドを続ける
そのままenter(shift+enter)するとエラーしてしまうので
面倒くさいけど、表示したい段階になったらバックスラッシュを消してからenter(shift+enter)すると重ねて描ける。
jupyter notebookの場合
jupyter notebookであればセルごとにまとめてプロットしてくれるので、jupyter qtconsoleみたいな問題は起こらない。
参考
- ipythonでmatplotlibのグラフをinline表示する - 計算物理屋の研究備忘録
- ipythonのqtconsoleの色やフォントを設定する
- matplotlib, seabornの日本語表示
- スタートアップ時にインポート中のモジュールを表示
モジュールのリロード
モジュールをインポートして何か試したあとに「ここのメッセージわかりにくいなぁ」とか「この定数間違えた!」とかよくあること。
そういう時は修正して再度プログラム走らせたいのだが、エディタ上で書き換えた修正が反映されなくてよく戸惑うので解決法。
修正してimportしても修正が適用されない件
pythonのimportはメモリの効率化のため、一度importされたモジュールは再度importされないようになっている。
def hello():
print('hello')
[In] import hello
[In] hello.hello()
[Out] hello
def hello():
print('f**k!')
[In] import hello
[In] hello.hello()
[Out] hello
## ここは'f**k!'と表示されたかった。
impモジュール
それでも修正したプログラムが修正適用されてインポートされないのは使えなさ過ぎるので、impモジュールでリロードできる。
[In]import hello
## ~~hello.pyの書き換え~~
[In]import imp
[In]imp.reload(hello)
[In] hello.hello()
[Out] f**k!
マジックコマンド%autoreload
ipython上では%autoreload
というマジックコマンドが用意されているので、impモジュールをインポートしなくてもリロードを簡単にできる。
%autoreload
自体を%load_ext
でロードしてこないとダメだけどね。
[In] %load_ext autoreload # マジックコマンド%autoreloadをロードする
[In] %autoreload hello
[In] hello.hello()
[Out] f**k!
すべてのモジュールを常にリロード
コンソールの最初で%autoreload 2
と打てば、すべてのモジュールはimportした際に差分チェックされて、書き換えられてたらリロードしてくれる。
[In] %autoreload 2
ipython実行時に常に%autoreload 2
ipython実行時に常に%autoreload 2
を打ち込みたいとき、~\.ipython\profile_default\ipython_config.py
に以下のように書き込まれると、ipython実行時に%load_ext
と%autoreload 2
が実行されたことになる。
c.InteractiveShellApp.exec_lines = ['%load_ext autoreload', '%autoreload 2']
参考
ipython とmodule reload と 設定ファイル
ipython を起動しながら自作モジュールを修正した場合
u1and0/dotfiles/.jupyter
u1and0/dotfiles/.ipython