.. title:: Pythonで心理実験 - 例題10-3
例題10-3:spyderを使う
================================
**A:** さて、今回は予告通りspyderという開発環境を紹介しよう。
.. figure:: img/10-3-01.png
**B:** ほほう、なんだか普通のWindowsアプリみたいな画面が出てきましたね。
**A:** うむ。IPythonはUnixとかでCUIに慣れている人向けかなあって感じだけど、spyderはMatlabやMicrosoftのVisualStudioとかに慣れている人にアピールすると思う。 まあ、この手の開発環境はずっと前に言ったように有料のものから無料のものまでいろいろあるんだが、今回は **個人的な趣味で** spyderを紹介しようと思う。
**B:** またそのパターンですか。で、いったいどんなところがAさんの好みなんですか?
**A:** まず、なんといってもこの図に表示されているように、matplotlibのグラフを別窓で表示することができる。 青と緑のカクカクした折れ線グラフが描かれているウィンドウだね。 正直なところ、これがストレスなく出来るっていう条件だけで、私が試した範囲ではIPythonかspyderの2択なんだ。
**B:** はあ。そんなに厳しい条件なんですか、これ。
**A:** 一度描画するだけなら他の環境でも出来る場合もあるんだけど、何度も描き直したり何枚も描いたりすると不安定になる。 私はデータ分析の時に十数枚も一気にグラフを描いたりするんでね、ここが不安定だとストレスがたまって仕方がない。
**B:** 不安定って?
**A:** 異常終了して、保存してないソースとかがパァになっちまうのさ。
**B:** そりゃストレスですね。
**A:** まあspyderはbeta版なんでspyder自体の安定性に多少問題はあるんだが…。とにかく、図を自由に描けるだけで素晴らしい。 さらに、エディタウィンドウをメインウィンドウから独立させることが出来る。 上の図の右上のウィンドウだな。 これも案外出来るやつ少ないんだが、ノートPCとかの狭いディスプレイで作業しないといけない時などに、エディタの幅を広くとりつつ他のペインの幅も確保したいなんて時に便利だ。
**B:** ペイン?痛み?
**A:** painじゃなくてpaneね。後で説明する。 他にもいろいろあるんだが、それはspyderならではって機能ではないんで追々説明しよう。 んじゃ、まずはインストール方法から始めようか。 spyderは `http://code.google.com/p/spyderlib/ `_ で配布されている。 python(x,y)というプロジェクト( `http://www.pythonxy.com/ `_ )を構成する"interactive scientific development environment"なんだが、単体でも使用できる。
**B:** なんでいきなり英語になってるんですか。
**A:** うむ。あまり訳が思いつかなかったんでな。python(x,y)のページを見ると、いわゆる統合開発環境(integrated development environment)はEclipseということになっている。 で、インタラクティブな科学計算やら可視化のための環境としてEclipseとは別にspyderを用意しているわけだ。 まあ、spyderがなんと呼ばれようとどうでもいい。それが便利であるならば。
**B:** ま、そりゃそうですね。で、どのファイルをダウンロードしてくればいいんですか?
**A:** spyderプロジェクトのトップページに書いているとおり、spyderはPyQt4に依存している。 だからPyQt4( `http://www.riverbankcomputing.co.uk/software/pyqt/intro `_ )をまずインストールしなければいけない。
**B:** ええっ。面倒くさいなあ。なんなんですか、これ?
**A:** pythonからQtを使うためのパッケージだな。 Qtってのは…まあ詳しく知りたければ自分で調べてもらえばいいけど、例題5で出てきたTkinterが近いかな。 ユーザーインターフェースを構築するためのフレームワークと言えばいいのかな。
**B:** …いいです。とにかく入れればいいんですね? あとspyderのトップページにはQSci…?なんとかとpyflakesとかいうのも書いてあるんですけど、これもダウンロードしてこなきゃいけないんですか?
**A:** QScintilla2な。これはPyQt4のページに行ってWindows用のBinary Packageをダウンロードしてきたら、一緒についてくる。 だから個別にダウンロードする必要はない。pyflakesはpythonのプログラムの文法チェックをしてくれるツールだが、これはインストールしなくてもspyderは使える。 興味があれば後からインストールすれば問題ないので、とりあえず置いておこう。
**B:** ええと、ぼくのPCはpython2.5だからPyQt4のDownloadsのページからPyQt-Py2.5-gpl-4.7.3-1.exeをダウンロードしました。 あとspyderのページのDownloadsからspyder-1.1.0beta7_py25.exe。これでOKですか?
**A:** OK。spyderは2010年6月現在急ピッチで開発が進んでいて、どんどん新しいbeta版が出ているので、皆さんがチェックする頃には1.1.0正式リリースや次のbeta版が出ているかも知れません。 使用しているpythonのバージョンに合ったインストーラをダウンロードしてくださいね。
**B:** PyQt4をインストール、続いてspyderをインストール、と。完了しました。
**A:** よしよし、じゃあ…っとっと。
**B:** ん? どうしましたか?
**A:** 大事なことを忘れていた。ぜひscipyとmatplotlibもインストールしておいてほしい。 scipyは `http://www.scipy.org/ `_ 、matplotlibは `http://matplotlib.sourceforge.net/ `_ からダウンロードしてくれ。
**B:** なんですか、次から次へと。
**A:** scipyはpythonで科学計算をするための、matplotlibはpythonでグラフを描くためのパッケージだ。 実は今までの例題でもちょこちょこと使っていたんだけど、良い機会なのでそろそろ本格的に紹介を始めたいと思う。
**B:** これは入ってないとspyderは動かないんですか?
**A:** 動くことは動くけど、scipyやmatplotlibに依存した機能は使えない。
**B:** そりゃそうでしょうね。
**A:** matplotlibはダウンロードページが分かりにくいんで、ページを開いて"download"を検索するといい。
**B:** はいはい。結局、今回新たに入れるのはこれだけですね?
インストールするパッケージと配布元
+ scipy ( `http://www.scipy.org/ `_ )
+ matplotlib ( `http://matplotlib.sourceforge.net/ `_ )
+ PyQt4 ( `http://www.riverbankcomputing.co.uk/software/pyqt/intro `_ )
+ spyder ( `http://code.google.com/p/spyderlib/ `_ )
**A:** そうだね。VisionEggがすでに使えているならnumpyとかは入っているはずだから大丈夫なはず。
**B:** …。インストール完了。やれやれ。で、どうやって使うんですか。
**A:** 普通のWindowsアプリケーションのように「すべてのプログラム」を開いて。
**B:** よいしょ。あれ、なんか(all)とか(basic)とかついたのがいっぱいあるんですけど。
.. figure:: img/10-3-02.png
**A:** うむ。これはspyderを立ち上げる時に読み込むパッケージの違いを示している。 例えばallにしておけばいちいちimport osと入力しなくても最初から読みこまれてるわけだ。 読みこむパッケージが多いほど時間がかかるんで、用途に応じて使い分けるといい。 まあ私が自分で使うときはほぼ間違いなくpylabを使うんで、allを選ぶことにしている。
.. csv-table::
:delim: $
表示される項目$読み込むパッケージ等
spyder(light)$spyderアドオンを一切読みこまない
spyder$spyderアドオンを読みこむ
spyder(basics)$spyderアドオンに加えてnumpy、scipy、matplotlibを読みこむ
spyder(all)$basicsに加えてpylab、os、sys、re、time、os.pathwを読みこむ
**B:** ふうん。じゃあallを選んでみます。…結構時間かかりますね。
**A:** numpy、scipyといった大物パッケージをロードするからね。仕方ない。 さて、ウィンドウが開いたぞ。spyderはウィンドウ内がペインと呼ばれる複数の領域に分割されている。 PowerPointとかOutlookを使った事がある人はおなじみだろう。 ペインの大きさはかなり自由に調節できるので、使いながら自分にとって快適な配置を探していけばいい。 PowerPointなんかとちょっと違うのは、どのペインにどの項目を表示するかを自由に選択できること。 あるペインの内容を隣のペインに移したければ、こんなふうにペインのタイトルバーを移動先のペインへドラッグしてやればいい。
.. figure:: img/10-3-03.png
**B:** どれどれ…へえ、ぐにぐに動いて面白いですね。でも項目が何のためのものなのかさっぱりわからないんで、どうしたらいいのかわかんないんですけど。
**A:** む。そりゃそうだな。 じゃあひとつひとつ説明して…と言いたいところだが、spyderはかなり機能が豊富なんで実は私もほとんどの機能は使っていない。 参考までに言っておくと、私は3ペインにして左側に大きくInteractive consoleとEditor、右上にObject InspectorとWorkspaceとFile Explorer、右下にExternal consoleとHistory logを設定している。 ちなみに間違えて消してしまった項目は上のメニューのViewでチェックを付けると復活する。
**B:** うーむ。何がどういいのかよくわかりませんが…。
**A:** まあレイアウトは好みが分かれるところなんで特におすすめすることはないんだが、 狭い画面のPCでグラフ描きをするんならメニューのInteractive console→Interactive console settings→Dockable figuresのチェックを外しておくことをお勧めする。 このチェックがついたままだと、グラフを描画した時にspyderのどこかのペインにグラフが表示されてしまい、グラフが小さくてとても見づらくなる。
.. figure:: img/10-3-04.png
**A:** 同様に、EditorもEditorペインの左上のアイコンからNew Windowを選ぶとspyderのウィンドウとは独立したエディタウィンドウが開く。 これも画面のレイアウトが増してとても便利なのでうまく使ってほしい。このあたりの柔軟さも私がspyderをお勧めしたいポイントだ。 こういう機能がある開発環境って案外少ないんだよな。
.. figure:: img/10-3-05.png
**B:** ははあ、なんだか例題10はひたすらAさんの好みを聞かされる回になっているような。
**A:** ほっとけ。さて、spyderもIPythonと同じようにいろいろな方法で作業を補助してくれる。まずはInteractive consoleを開いてプロンプト(>>>)にos.chと入力してみてくれ。
**B:** os.ch、と。おお、なんかリストが出てきた。これってos.chに当てはまるosパッケージの関数ですか?
.. figure:: img/10-3-06.png
**A:** 関数とは限らないけどな。定数とか。 IPythonと違ってTabを押しちゃうとマッチするもののうちリストの一番前の候補が勝手に選ばれちゃうので、どっちが好みかは意見が分かれるだろうな。そうそう、spyderを立ち上げるときにallを選ぶか、立ち上げてからimport osしていないとosパッケージが読み込まれないのでこの通りにならないことに気をつけてほしい。
**B:** こういう説明を書くときには選択肢がたくさんあるってのは大変ですねえ。
**A:** ほう。B君が気を使ってくれるとは嬉しいな。 osパッケージが出てきたついでにちょっと話しておくと、spyderではIPythonのようにcdコマンドでぱぱっとカレントディレクトリ変更なんてできない。となると普通はos.chdir()を使ってカレントディレクトリを変更しなきゃならんのだが、それも面倒なんでspyderではGUIで変更できるようになっている。 標準状態だとウィンドウの右上にWorking directoryというツールバーがあって、ここでカレントディレクトリを変更できる。フォルダのアイコンをクリックしたら、普通のWindowsアプリケーションのようなダイアログが出てきて変更できる。
.. figure:: img/10-3-07.png
**B:** こりゃいいや。ぼくはIPythonよりこっちの方がいいなあ。
**A:** 私ぁcdコマンドの方が好きだがな。さて、さらにspyderの便利機能を見ていこうか。x=linspace(と入力して。
**B:** ( で止めるんですね? はいはい。
.. figure:: img/10-3-08.png
**A:** ほら、(を入力した時点で、このメソッドの引数のリストが表示される。デフォルト値付き変数のデフォルト値もきちんと表示されている。
**B:** これも便利ですねえ。
**A:** これだけでも十分便利なんだが、この時にどこかのペインにObject inspectorを表示しておくともっとありがたい。そら。
.. figure:: img/10-3-09.png
**B:** へえ!これ、ヘルプの内容ですよね。自動的に出てくるってのがありがたいですねえ。
**A:** 自動的にも表示されるし、Objectという欄に直接調べたいものを入力してもいい。ヘルプの全体を参照したいのであればOnline helpをペインにいれておけばいい。
**B:** ヘルプが日本語だったらもっといいのになあ。
**A:** そりゃ贅沢言いすぎだな。linspaceが出てきたからちょっと遊んでおくか。Interactive consoleで以下のように入力してみて。
::
>>> x = linspace(-5,5,100)
>>> y1 = cos(2*x)*exp(-x**2)
>>> y2 = sin(2*x)*exp(-x**2)
>>> plot(x,y1,'bs-',x,y2,'ro-')
**B:** ええと、長いですね。どれどれ。
**A:** Matlabを使う人なんかは何をしようとしているかピンと来るんじゃないかな。
**B:** …と、Enter!
.. figure:: img/10-3-10.png
**A:** 見ての通り、今のコマンドはグラフを描くコマンドというわけだね。さっき言ったDockable figuresのチェックをはずしていれば、こんな風に新しいウィンドウが開いてグラフが描画される。さてB君、これは何のグラフかわかるかね。
**B:** へ?何のって…なんですか?
**A:** 視覚情報処理の講義で見てるはずだがなあ。ちゃんと調べておくこと、宿題ね。 今入力したコマンドを詳しく説明したいところだけど、まだspyderについて説明したことがいくつか残っている。もうずいぶん長くなってしまったから、脱線はこのくらいでやめてといて話を進めよう。 Editorペインでは、pythonのスクリプトを編集することが出来る。 テキストの編集は慣れたエディタを使うのがいいって人も多いだろうが、spyderのエディタは自動的に簡単な文法チェックをしてくれる。 例えばさっき入力してもらったグラフ描画のコマンドを入力すると、問題がある行の先頭に!マークが表示され、問題の部分に赤線が表示される。
.. figure:: img/10-3-11.png
**B:** ん?これは何が問題なんですか?
**A:** expという関数が定義されていないのさ。 さっきInteractive consoleでこれを実行してもらった時にはすでにpylabからexpがインポートされていたから問題なかったんだが、 このスクリプトをspyderを介さずに実行しようとするとexpなんて知らないよ、というエラーになる。 9行目のfrom pylab import linspace, ... の中にexpが含まれていないのが原因だね。
**B:** xに赤い枠がついてるのは何ですか?
**A:** このスクリーンショットは11行目のxの前にカーソルがある時に撮ったんだが、こういったオブジェクトの上にカーソルを置いておくと、スクリプト内で同じオブジェクトが出現しているところに赤枠が表示される。 この変数、次はどこで使ってるかな?とか探したい時に便利だ。
**B:** なるほど。
**A:** 他にもコメント、文字列、定数とかのフォントが自動的に着色されたりしていて、ソースが読みやすい。 さて、9行目にexpを追加して実行してみるか。実行するにはメニューのSourceからRunを選択すればいい。 これまたたくさんRunの種類があって困るが、大きく分けるとinteractive consoleで実行するか、external consoleで実行するかの違いだ。 詳しい話はいずれ機会があればするとして、ここではRun in interactive consoleにしてみよう。メニューを見ての通り、F9がショートカットキーなのでF9を押してもいい。
.. figure:: img/10-3-12.png
**A:** ちなみにEditorを別ウィンドウで開いている場合は、ウィンドウ上部にRunツールバーが表示されている。 ここからRunする事も出来る。
.. figure:: img/10-3-13.png
**B:** じゃあここはF9で。…あれ、なんだかエラーになっちゃいましたよ。
.. figure:: img/10-3-14.png
**A:** うむ。エラーになるようにわざと間違えておいたんだ。 14行目最後の'ri-'という引数が間違っているんだが、それはともかくとして、ここでずらずらっと青い文字でファイル名と行番号が書いてあるだろ。 これをクリックすると、Editorペインで該当するファイルが開かれて問題の行へ自動的にジャンプする。 問題が生じている原因を調べてプログラムを修正する時にとても便利だ。 こういうインタプリタとエディタの自然な連携がspyderのような統合開発環境の強みだな。
**B:** なるほどー。
**A:** じゃ、急いで次の話題へ。あと二つ紹介してお終いにしたい。
**B:** なんかせわしないですね。次は何ですか?
**A:** WorkspaceではInteractive consoleで使っている変数を確認できる。 ちょっと次のように入力してみて。3行目はちゃんと行頭に空白を入れて、
::
>>> s = u'テキストの例'
**B:** はい、入力しました。
**A:** OK。じゃあWorkspaceを見てみて。 さっきグラフの描画をするために使った変数x、y1、y2に加えて今入力したsに格納されているオブジェクトのタイプとサイズ、値がこんなふうに一覧表示される。
.. figure:: img/10-3-15.png
**B:** へえ、さっきから同じことばかり言ってますけどこれも便利そう。
**A:** IPythonのようなUIとspyderのようなUI、どっちが好みかで評価は大きく分かれるだろうね。 CUIに馴染んだ人以外は多分spyderの方が入りやすいんじゃないかと思う。さて、ずいぶん長くなってしまったけどこれで最後。 File explorerではカレントディレクトリの移動や中にあるファイルの削除、名前変更、Pythonスクリプトの編集、実行といった操作が出来る。 pythonスクリプトファイルだけを表示するようにも、全てのファイルを表示するようにもできる。
.. figure:: img/10-3-16.png
**B:** うーん、今までちまちまとメモ帳とかcmd.exeで作業してたのが空しくなってきました。 今度からspyderを試してみようかな。
**A:** 何度も繰り返してるけど、快適な環境は人それぞれだから、とにかく試してみるといいよ。 案外cmd.exeとメモ帳の方がよかったと思う面もあるかもしれない。借り物の勝手にアプリケーションをインストール出来ないPCでも使えるとかね。 pyflakesの話とかは全くすっ飛ばしてしまったけど、かなり長くなってしまったからここでspyderの紹介は一区切りとしよう。
**B:** ふーっ、長かったですね。
**A:** んじゃ、次は気分を改めて例題11として、グラフ描画とかの話をするか。んじゃ、今日はここまで。