ひよっこ。

I want to…

Posts Tagged ‘python’

IPythonの拡張機能を作成する

Posted by hikaruworld : 2012 1月 5

bazaarのプラグインを書こうとしてIPythonを起動したら、
何故かIPythonのエクステンションの書き方を調べてしまったのでログとして残しておきます。

IPythonのextensionの書き方は公式サイトIPython extensionsが参考になります。
サンプルとなるエクステンションは、IPython/extensions以下を見るとよいかと思います。

IPythonでextensionを読み込ませるためには2つの手順が必要になります。

1. IPythonのロード設定

IPython起動時に指定したエクステンションをロードするようにProfileに設定を行います。
前回Profileについては簡単に触れていますが、
エクステンションをロードするときは以下のように設定します。

# A list of dotted module names of IPython extensions to load.
c.InteractiveShellApp.extensions = [
    'hello'
]

2.エクステンションの配備

上記のようにロード設定をした後には、
当然エクステンションを配備してあげる必要があります。
IPythonのエクステンションは

os.path.join(self.ipython_dir, 'extensions')

が認識されます。

つまり、ipython起動時に--ipython-dirを指定していない場合、
デフォルトでは$HOME/.config/ipythonが適用されますので、$HOME/.config/ipython/extensionsを作成すればよい事になります。
今回の例ではhelloというエクステンションを読み込んでいるので、ディレクトリ構成は以下のようになります。

$HOME/.config/ipython
└── extensions
    └── hello.py

※関連部分のみ抜粋

3.エクステンションの書き方

IPython起動時の処理

IPythonが起動/終了した場合に何か処理を行いたい場合、以下の関数を定義する事で自動で読み込まれます。

# 起動時の処理
def load_ipython_extension(ipython):
	pass

# 終了時の処理
def unload_ipython_extension(ipython):
	pass

引数で渡されるipythonはTerminalInteractiveShellやInteractiveShellAppなどのインスタンスになります。

マジックコマンドの設定

IPythonはマジックコマンドが定義されていて、色々便利ですよね。
マジックコマンドって何って人は%入力して<TAB>で一覧が確認出来ます。使い方は%XXX?で確認可能です。

In [3]: %
%alias                   %logstart                %pylab
%autocall                %logstate                %quickref
# いっぱいあるので以下省略。

In [3]: %pwd?
Type:       Magic function
Base Class: <type 'instancemethod'>
String Form:<bound method TerminalInteractiveShell.magic_pwd of <IPython.frontend.terminal.interactiveshell.TerminalInteractiveShell object at 0x1017a5ed0>>
Namespace:  IPython internal
File:       ~/.virtualenvs/bazaar/lib/python2.7/site-packages/IPython/core/magic.py
Definition: %pwd(self, parameter_s='')
Docstring:
Return the current working directory path.

Examples
--------
::

  In [9]: pwd
  Out[9]: '/home/tsuser/sprint/ipython'

で、本題。
エクステンションでも独自のマジックコマンドを定義する事が出来ます。
マジックコマンドを定義したい場合、

define_magic(magicname, func)

で登録する事が可能です。

たとえばsayというマジックコマンドを登録したい場合、この様に読み込ませます。

def say_impl(self, parameter_s=''):
	# sayコマンドの実体。引数はparameter_sに設定される。
    print 'Hello %s' % parameter_s

def load_ipython_extension(ipython):
	# ipythonが起動したタイミングで'say'というコマンドを定義する
	ipython.define_magic('say', say_impl)

これをipythonで起動して、実行するとこんな感じで表示されます。

In [1]: %say taro
Hello taro

マクロなどを定義したい場合はdefine_macro(name, themacro)という関数が準備されています。
自分は必要なかったので確認していませんが…。

以上です。
簡単ですね。日本語情報がないことをのぞけば….

Posted in program | タグ: , , | Leave a Comment »

ipython_config.pyの設定メモ

Posted by hikaruworld : 2012 1月 5

メモです。
大したカスタマイズしていませんが。

# -*- coding: utf-8 -*-
# Configuration file for ipython.

c = get_config()

# lines of code to run at IPython startup.
# 頻繁に利用するライブラリをimport
c.InteractiveShellApp.exec_lines = [
    'import os',
    'import sys',
    'import numpy'
]

#------------------------------------------------------------------------------
# TerminalInteractiveShell configuration
#------------------------------------------------------------------------------
# Set the editor used by IPython (default to $EDITOR/vi/notepad).
# c.TerminalInteractiveShell.editor = 'vi'
# デフォルトエディタをvimに
c.TerminalInteractiveShell.editor = '/usr/bin/vim'

# Enable auto setting the terminal title.
# Terminalにタイトル表示
c.TerminalInteractiveShell.term_title = True

# Automatically call the pdb debugger after every exception.
# エラー発生時にpdbを起動
c.TerminalInteractiveShell.pdb = True

#------------------------------------------------------------------------------
# PrefilterManager configuration
#------------------------------------------------------------------------------
# 複数行のスクリプトを有効化...何だけどなんかうまく行かん...
c.PrefilterManager.multi_line_specials = True

#------------------------------------------------------------------------------
# AliasManager configuration
#------------------------------------------------------------------------------
# lsやgrepをカラー設定
c.AliasManager.user_aliases = [
    ('ls', 'ls -G'),
    ('grep', 'grep --color-auto')
]

Posted in program | タグ: , , | Leave a Comment »

ipythonのvirtualenvsごとのprofile設定

Posted by hikaruworld : 2012 1月 3

virtualenvでipythonを利用する場合は、
ipython と virtualenv を同時に使う方法が参考になります。
自分の場合は、上記リンクの第一の方法で設定しています。

で、上記サイトでも言及されている訳ですが。
ipythonは起動時に設定ファイル(いわゆるprofile)を読み込みます。

ipython0.12の場合、読み込み順はConfiguration file locationに従って行われます。

If the ipython_dir command line flag is given, its value is used.
If not, the value returned by IPython.utils.path.get_ipython_dir() is used. This function will first look at the IPYTHON_DIR environment variable and then default to a platform-specific default.

なおipython-dirは引数に指定しない限りデフォルトでは、$HOME/.config/ipythonが参照されます。

ipythonで任意のプロファイルを利用したい場合は、

ipython --profile XXX

のXXXで指定する事が可能です。

ipython-dirをVIRTUAL_ENV以下を見るようにカスタマイズしてもよいのですが、
自分の場合は&HOME以下はbazaarでバージョン管理しているので、virtualenvのpostactivateをこんな感じで編集しておきます。

#!/bin/bash
# This hook is run after every virtualenv is activated.
# cat ~/.virtualenvs/postactivate 

which ipython >/dev/null 2>&1
if [ $? -eq 0 ]; then
    # 面倒なのでpythonでsplit
    current_ipython=`python -c "print '$VIRTUAL_ENV'.split('/')[-1]"`
    alias ipython="ipython --profile $current_ipython"
fi

これでworkonで任意のvirtualenvsを有効にした場合にipythonのコマンドが設定されていれば、
–profileにvirtualenvsの環境名がエイリアスに設定されます。

以上です。

Posted in program | タグ: , , | Leave a Comment »

ipythonの>>>

Posted by hikaruworld : 2012 1月 1

久々にipythonをインストールしたら0.12になっていて

ipython -cl

とかやったら、怒られた。

んー、と思ってドキュメント読んでたら、%doctest_modeってのがあるんですな。

ipython
In [1]: %doctest_mode
Exception reporting mode: Plain
Doctest mode is: ON
>>> 

となります。

なるへそ。

以上です。

Posted in program | タグ: , | Leave a Comment »

PyPress4gaeの環境構築

Posted by hikaruworld : 2010 8月 12

GAE/P上でwordpressクローンのPyPressが動かせると聞いて試してみた。

やってみた感想は目茶苦茶簡単でした。
以下構築したページ
http://hikaruworld.appspot.com/

以下は、構築方法というか、pypress4gaeに書いてある通り。
引用

Download: http://pypress4gae.googlecode.com/files/pp4gae-0.1.1.tar.gz

Deploy instructions: first>

edit app.xml line 1 “application: {{your_app_name}}”
second>
enter web2py/ and execute “appcfg.py update ./”
Notes: Maybe it won’t work right after deployed, wait minutes or hours for GAE server to finish indexing the database.

Any suggestion or bug please put in to Issues of this project.

1. pp4gae-0.1.1.tar.gzをダウンロードすべし
2. app.xmlのアプリケーション名をGAE上に登録したアプリ名へ修正すべし
3. appcfg.pyなりランチャーなりを使ってデプロイすべし。

注意点:デプロイ後すぐにGAE上のサーバに反映されるわけじゃないからちょっと待ってな。

というわけで、1.2.3と実践してトイレに行って帰ってきたらアクセスできるようになっていました。
素敵ですね。

直したい部分はソースを修正すればいいわけですし。

Posted in program | タグ: , | Leave a Comment »

Python-FIT#4 done.

Posted by hikaruworld : 2010 8月 8

というわけで、だらだら続けているPython-FIT#4。

今日のお題は「データ構造」でした。
とりあえずSkypeベースだけで書き出し。
やっぱローカルにメモ取るか、Skypeにログを残さんとせっかくの内容をすぐに思い出せないorz…

■リスト型についてもう少し

  • pass

■リストをスタックとして使う

  • pass

■リストをキューとして使う

  • pass

■実用的なプログラミングツール

  • reduceはpy3から関数に移動されている

■リストの内包表記

■del 文

  • 関係ないけど、Pythonのメモリ管理はガベージコレクション
  • Javaみたいな管理方法で3世代
  • 循環ガベージコレクションに関しては以下。後で読む
    http://www.python.jp/doc/2.5/ext/node24.html

■タプルとシーケンス

  • 複数同時代入のアンパックってタプルじゃなくても使えたとは
  • リストとタプルの違いって変更可能かどうかってこと?
    http://d.hatena.ne.jp/m_py_study/20100127/1264544003
  • 関数の返却に多値を利用するとタプルで返却するのでよく使う気がする

■集合型

TODO setに変換して検索するのと、そのまま検索するのとはどちらが高速なのか

■辞書

  • キーワード引数でdict型の構成は初耳。
  • キーワード引数でやる場合とやらない場合の違いは?
  • キーワード引数を使うと変数指定は無理。
>>> k = "abc"
>>> dict(k=123)
{'k': 123}
>>> d = {}
>>> d[k] = 123
>>> d
{'abc': 123}
<h3>

■ループのテクニック

pass

■条件についてもう少し

  • 比較の連鎖は便利
  • 比較結果の代入はしらなかった

■シーケンスとその他の型の比較

tuple > str > listで比較される。
便利というよりもむしろ怖い。コーディングミスではまりそう。

あ、最後に環境周りに関して

* TeamViewerはHostが重くて使い物にならない。
* もうちょっとペースあげたいな。

Posted in program | タグ: , , | Leave a Comment »

Python-FIT 勉強会0回目の開催のお知らせ

Posted by hikaruworld : 2010 5月 6

Python-FITの勉強会第0回目を行います。

申し込みはこちらになります。
なお、Python-FITはGoogleGroupを利用しています。

以下は、ATNDからの引用です。


ここから

Python-FITはFukui/Ishikawa/Toyamaの北陸3県で行われる、Pythonの勉強会です。

まずは0回目として、今後どのようにPythonの勉強会を進めていくかを相談したいと思います。
コードリーディングをするか、読書会をするか、講義形式かetc….

今のところはDjangoのコードリーディングが有力ですが、ほかにも面白い勉強ネタをお持ちの方がいれば教えてください。

当日の予定

  1. 14:00 – 顔合わせ
  2. 14:30 – Pythonの経験、何がしたいのか
  3. 15:00 – Djangoの説明 @rch850
  4. 15:15 – DDD&Spnixの説明 @aroma_black
  5. 15:30 – WSGIの説明 @yuuitiro
  6. 15:45 – 実際に触ってみる(Djangoであればチュートリアルなど)
  7. 17:00 – 飯と酒?

必要なもの

PC(必須ではありませんが、あるとよいです)
出来ればPython2.6系及びDjango1.1辺りをインストールしておくと良いでしょう。

補足

  • 当日はUstを行います。Skypeは@hikaruworldまで相談ください
  • 1回目以降はサテライトによる実施を考えています

ここまで


みなさまの参加をお待ちしておりまする。

以上です。

Posted in program | タグ: , | Leave a Comment »

BeautifulSoupが素敵

Posted by hikaruworld : 2010 3月 11

BeatuifulSoupはPythonのHTMLパーサです。
「びゅーてぃふるすーぷ」と読むらしい。おいしいスープ…

HTML形式(XMLも)のファイルを読み込んで、スクレイピングとか簡単にできます。
ちょっとツールを作るときに使ってみたらなかなか便利だったので簡単に紹介しておきます。

たとえばaタグの【href】だけ抜き出したいような場合。
これでできます

from BeatuifulSoup import BeatifulSoup
html = r"<html><body><a href="abc">test</a></body></html>"

soup = BeautifulSoup(html)
print soup.findAll("a");
>>>  <a href="abc">test</a>
# hrefだけ抜きます
soup.find("a").get("href")

以上。
findAllがキモです。大体これで必要なタグをまとめてとることができます。

余談。

今回TracのWikiの情報から不要なリンクや装飾を取っ払った形でHTML構造情報がほしかったんですが、
WikiとHTMLパーサの組み合わせはなかなか強力です。

実はBeautifulSoupも完全ではなく、不適切なHTMLになっていると失敗することがあります
(案外解釈してくれたりもしますが)。

ところがWikiを利用した場合は、
ユーザはWiki文法を利用して書き、Wiki内部のWikiパーサがHTMLへと変換するので、
適切なHTMLが生成されるので、BeautifulSoupの弱点を補うことができるわけです。

Posted in program | タグ: , | Leave a Comment »

Pythonメモ_その1

Posted by hikaruworld : 2009 12月 25

最近ちょっとしたサーバサイドスクリプトはPythonで書くようになってきたんですが、
毎回同じような事を忘れるのでメモ。

1. サーバの名前解決(要するにnslookup)

# socketをimport
import socket

# ホスト名からIPアドレスを引く場合(正引き)
socket.gethostbyname("localhost")
>>> '127.0.0.1'

# IPアドレスからホスト名を引く場合(逆引き)
socket.gethostbyaddr("127.0.0.1")
>>> ('localhost', [], ['127.0.0.1'])

17.2 socket — 低レベルネットワークインターフェース

2. ループ中のインデックスを取得したい

#ループしたい配列
arys = [1,2,3,4,5]

# for文で対象の配列をenumurate()で囲む
for index, param in enumerate(arys):
	print index, param

#出力結果
>>> 0 1
>>> 1 2
>>> 2 3
>>> 3 4
>>> 4 5

3. 複数の配列をループで一緒にまわす場合

# ループしたい配列
arys1 = [1,2,3,4,5]
arys2 = ["a","b","c","d","e"]

>>> 1 a
>>> 2 b
>>> 3 c
>>> 4 d
>>> 5 e

#zip()で囲んで実行する
for a1, a2 in zip(arys1, arys2):
	print a1, a2

#ちなみにzip自体は、リストのタプルをタプルのリストにする関数
print zip(arys1,arys2)
>>> [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')]

4. 複数の値を代入

# 値が異なる場合
a, b, c = ("a", "b", 1)

# 値が同じ場合
a = b = c = 1

今日の反省。
1のsocket.gethostbyaddrが見つけれずにsubprocessで書いた後に気がついて、書き直した私。

Posted in program | タグ: , , | Leave a Comment »

FlashViewプラグインに引数を追加してみた

Posted by hikaruworld : 2009 9月 28

tracでFlashを表示するためのプラグインとしてFlashViewPluginというプラグインがあります。
これは大変便利なのですが、引数として、対象となるswfファイル、幅、高さしか渡せないため、
FlashVarsで引数やquorityを設定できないのでちょっと困るときがあります。ありますよね?

というわけで、このマクロを少し拡張してみました。
やりたいことは以下のとおりです。

  • FlashVarsを渡したい
  • quorityを指定したい(デフォルトはlow)

できるだけ、元ソースに編集を加えない方向で修正してみました。
修正結果のdiffを張っておきます。

diffを適用すれば以下のような感じで利用できるようになります。

[[FlashView(hoge.swf, 400,300,vars="hoge=piyo", quality=hight)]]
変数 内容 補足
第1引数 対象のswfファイル 必須
第2引数 必須?
第3引数 高さ 必須?
keyがvars FlashVarsに渡される引数(ペア値を渡す場合は括弧でくくること) 任意
keyがquality 解像度。デフォルトはlow 任意
*** flashview.py.r2457	2009-09-28 14:27:54.000000000 +0900
--- flashview.py	2009-09-28 14:30:04.000000000 +0900
***************
*** 5,11 ****
  from cgi import escape as escapeHTML
  import os
  from trac.core import *
! from trac.wiki.api import IWikiMacroProvider

  def swfsize(f):
	  magic, version, datasz = unpack("<3s1B1L", f.read(8))
--- 5,11 ----
  from cgi import escape as escapeHTML
  import os
  from trac.core import *
! from trac.wiki.api import IWikiMacroProvider, parse_args

  def swfsize(f):
	  magic, version, datasz = unpack("<3s1B1L", f.read(8))
***************
*** 63,69 ****
		  # args will be null if the macro is called without parenthesis.
		  if not content:
			  return ''
!         args = content.split(',')
		  filespec = args[0]

		  # parse filespec argument to get module and id if contained.
--- 63,70 ----
		  # args will be null if the macro is called without parenthesis.
		  if not content:
			  return ''
!         args, kw = parse_args(content);
!         #args = content.split(',')
		  filespec = args[0]

		  # parse filespec argument to get module and id if contained.
***************
*** 142,151 ****
				  width = args[1]
				  height = args[2]

		  vars = {
			  'width': width,
			  'height': height,
!             'raw_url': raw_url
			  }

		  return """
--- 143,165 ----
				  width = args[1]
				  height = args[2]

+         # Custom Options..
+         if "vars" in kw:
+             vars_val = kw['vars'].strip("\"")
+         else:
+             vars_val = ''
+         if 'quality' in kw:
+             qlt = kw['quality'].strip("\"")
+         else:
+             # default parameter
+             qlt = "low"
+ 
		  vars = {
			  'width': width,
			  'height': height,
!             'raw_url': raw_url,
!             'vars_val': vars_val,
!             'qlt': qlt
			  }

		  return """
***************
*** 153,161 ****
		  codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"
		  width="%(width)s" height="%(height)s">
	<param name="movie" value="%(raw_url)s">
!   <param name="quality" value="low">
	<param name="play" value="true">
!   <embed src="%(raw_url)s" quality="low" width="%(width)s" height="%(height)s"
		   type="application/x-shockwave-flash"
		   pluginspage="http://www.macromedia.com/go/getflashplayer">
	</embed>
--- 167,176 ----
		  codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"
		  width="%(width)s" height="%(height)s">
	<param name="movie" value="%(raw_url)s">
!   <param name="quality" value="%(qlt)s">
	<param name="play" value="true">
!   <param name="FlashVars" value="%(vars_val)s" />
!   <embed src="%(raw_url)s" quality="%(qlt)s" width="%(width)s" height="%(height)s" FlashVars="%(vars_val)s"
		   type="application/x-shockwave-flash"
		   pluginspage="http://www.macromedia.com/go/getflashplayer">
	</embed>

面白かったのは、trac.wiki.api. parse_argsという関数がめちゃ便利でした。
この関数は、引数に渡されたマクロのパラメータを分解してくれるんですが、
例えば[[Hoge(http://hoge/, 400, piyo=hogepiyo)]]という値の場合

http://hoge/, 400, piyo=hogepiyo

という文字列が渡されてくるのですがparse_argsを使って以下のようにします。
[/sourcecode]
args, kw = parse_args(content);
[/sourceocde]
すると、argsには

list: [u’http://hoge/&#8217;, u’400′]

kwには

dict: {‘piyo’: u’hogepiyo’}

が渡されます。

つまり、argsにはキーを持たない値の一覧、kwにはキーと値のペアを辞書型で渡してくれるという優れものです。
これは面白いので、是非ソースを…と言いたいところですが
これはまた後日tracのソースを読みながら見てみたいと思います(使い方はhelp()で)。

ということをやった後に実は既に対応されている方がいました(SWFObjectの対応に併せて、Flashvarsも渡せるようにしてくれています)。

何が悲しいかといえば、既に自分のプロジェクトでもパッチを適用していたことに後で気がついたことです。
amlineというグラフチャートを利用していたので、SwfObjectも設定されているし。
悲しい…

まぁ、SWFObjectをいちいちヘッダーに埋め込みたくないようなかたがいれば使ってください。

Posted in program | タグ: , , | Leave a Comment »