‘Python’ カテゴリーのアーカイブ

IronPythonとジェネリックと初期値わたし

C#勉強会に行って自己紹介で「MVVMパターン用のフレームワーク使ってViewとViewModelはC#、ModelはIronPythonで書います」と言ったら微妙な空気になりました、夏。

muraveです。

というわけでC#とIronPythonを組み合わせて書いてます。基本的に配列や辞書は便利なのでPythonのモノ使ってましたがパフォーマンス・チューニングやっててジェネリック使ったほうがいいところもあるかな、と。

IronPython側でのジェネリックの書き方は知っててたまに使ってたんですが(C#での<>が[]になります)、試したら普通に初期値も与えられるのにちょっと感激。

C#で書くとList<string>の場合

>>> import site
>>> import clr
>>> from System.Collections import Generic as DotNetCollectionsG

>>> dot_l = DotNetCollectionsG.List[str]()
>>> print dot_l
List[str]()

>>> dot_l = DotNetCollectionsG.List[str](['a', 'b'])
>>> print dot_l
List[str](['a', 'b'])

C#で書くとDictionary<string, int>の場合

>>> import site
>>> import clr
>>> from System.Collections import Generic as DotNetCollectionsG

>>> dot_dict = DotNetCollectionsG.Dictionary[str,int]()
>>> print dot_dict
Dictionary[str, int]()

>>> dot_dict = DotNetCollectionsG.Dictionary[str,int]({'a':1 ,'b':1})
>>> print dot_dict
Dictionary[str, int]({'b' : 1, 'a' : 1})

ね♪

helpみたら普通に書いてありました。

>>> help(dot_dict)
Help on Dictionary[str, int] object:

class Dictionary[str, int](object)
 |  Dictionary[str, int]()
 |  Dictionary[str, int](capacity: int)
 |  Dictionary[str, int](comparer: IEqualityComparer[str])
 |  Dictionary[str, int](capacity: int, comparer: IEqualityComparer[str])
 |  Dictionary[str, int](dictionary: IDictionary[str, int])
 |  Dictionary[str, int](dictionary: IDictionary[str, int], comparer: IEqualityComparer[str])
 |
以下略

えらいなぁ。

Facebooktwittergoogle_pluslinkedintumblrmail

IronPythonでもRequestsが使いたい

Requests: 人間のためのHTTP
http://ja.python-requests.org/en/latest/

Pythonの便利なHTTPライブラリ Requests を IronPython でも使いたいわけです。
こんなことを書いているということは素直には使えないわけです。

一応動作してるかな〜、というところまで行けたのでメモしときます。IronPython は 2.7.3 で、Requests は 1.1.0 です。

ポイントは2つ。

まず一つ目。

sys._getframe が必要なので ipy.exe (or ipy64.exe) に -X:Frames オプションを付けて起動する。

オプションはこんな感じで確認できます。

C:\Users\murave>ipy -help
Usage: ipy.exe Usage: ipy [options] [file.py|- [arguments]]
 <前略>
 -X:Frames                Enable basic sys._getframe support
 <後略>

2つ目。IronPython には idna エンコーディングがないので回避する。

requests の models.py で使用されているので取り敢えずコメントアウト。

idnaで検索すると290行目あたりで使用されてます。

#        try:
#            netloc = netloc.encode('idna').decode('utf-8')
#        except UnicodeError:
#            raise InvalidURL('URL has an invalid label.')

netloc = netloc.encode(‘utf-8’).decode(‘utf-8’) に書き換えてみたりもしたのですが馬鹿らしい気がするのでコメントアウトしました。
おそらくこの影響で「ドメインとURLの国際化」は未対応になってしまってますが、動かないよりはいいかと。

C:\Users\murave>ipy -X:Frames
IronPython 2.7.3 (2.7.0.40) on .NET 4.0.30319.18010 (32-bit)
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> import json
>>> r = requests.get('http://172.16.191.1:8001/api/v1_0/poll/')
>>> r.text
u'{"meta": {"limit": 20, "next": null, "offset": 0, "previous": null, "total_cou
nt": 3}, "objects": [{"id": 1, "pub_date": "2013-03-05T13:51:15", "question": "W
hat\'s up?", "resource_uri": "/api/v1_0/poll/1/"}, {"id": 2, "pub_date": "2013-0
3-06T10:01:35", "question": "\u65e5\u672c\u8a9e\u30c6\u30b9\u30c8", "resource_ur
i": "/api/v1_0/poll/2/"}, {"id": 3, "pub_date": "2013-03-06T13:51:15", "question
": "\u3044\u3044\u3044", "resource_uri": "/api/v1_0/poll/3/"}]}'
>>> res = r.json()
>>> print res['objects'][1]['question']
日本語テスト
>>> payload = {"pub_date": "2013-03-08T20:19:15", "question": "どうかね?"}
>>> r = requests.post('http://172.16.191.1:8001/api/v1_0/poll/', data=json.dumps(payload), headers={"Content-Type": "application/json"})
>>> r 

>>> payload = {"pub_date": "2013-03-08T20:19:15", "question": "putは?"}
>>> r = requests.put('http://172.16.191.1:8001/api/v1_0/poll/1/', data=json.dumps(payload), headers={"Content-Type": "application/json"})
>>> r

>>> r = requests.delete('http://172.16.191.1:8001/api/v1_0/poll/1/')
>>> r

と、requests.get、requests.post、requests.put、requests.delete 動いているようです。

Facebooktwittergoogle_pluslinkedintumblrmail

YAPC::Asia 2012 LTソン muraveスライド&デモ動画

スライド

 

デモ動画

PerlイベントでMobiRubyからIronPythonにつなぐネタをやって比較的スベった感じ。

YAPC::Asia 2012 楽しかった! LTはスベったけど!

Facebooktwittergoogle_pluslinkedintumblrmail

CentOS5.5 64bitにmod_pythonをインストール

CentOS5.5に標準で入っているPythonは2.4系でした。最初は何も考えずソース取って来てコンパイルしてインストールしてましたが、オプション無しでコンパイルするとmod_pythonのインストールにこけてしまいました。下記インストール手順になります。

Python 2.6

wget http://www.python.org/ftp/python/2.6.5/Python-2.6.5.tgz
tar xzvf Python-2.6.5.tgz
cd Python-2.6.5
./configure --enable-shared
CFLAGS="-fPIC" CXXFLAGS="-fPIC" LDFLAGS="/usr/local/lib" make
make install
cp libpython2.6.so* /usr/lib64/
vi /etc/ld.so.conf.d/python2.6.conf
+1:/usr/local/bin
/sbin/ldconfig
ln -s /usr/local/bin/python /usr/bin/python2.6

一旦ログアウト

ldd /usr/local/bin/python
libpython2.6.so.1.0 => /usr/lib64/libpython2.6.so.1.0 (0x00002b7ea57a7000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003d9cc00000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003d9c400000)
libutil.so.1 => /lib64/libutil.so.1 (0x0000003d9f800000)
libm.so.6 => /lib64/libm.so.6 (0x0000003d9d000000)
libc.so.6 => /lib64/libc.so.6 (0x0000003d9c000000)
/lib64/ld-linux-x86-64.so.2 (0x0000003d9bc00000)

lib64を見ているか確認

mod_python

wget http://ftp.kddilabs.jp/infosystems/apache/httpd/modpython/mod_python-3.3.1.tgz
tar xzvf mod_python-3.3.1.tgz
cd mod_python-3.3.1
./configure --with-apxs=/usr/local/apache2/bin/apxs --with-python=/usr/local/bin/python
vi src/connobject.c
-142:!(b == APR_BRIGADE_SENTINEL(b) ||
+142:!(b == APR_BRIGADE_SENTINEL(bb) ||
#フォーラムにありましたが、どうやらバグのようです。
chown apache:apache /usr/local/apache2/modules/mod_python.so
#権限は環境に合わせてください
Facebooktwittergoogle_pluslinkedintumblrmail

IronPython Console をもっと便利に(TABによる補完とか)

IronPyhton の開発環境を構築しています。

お客様に .NET Framework 4.0 が必要な提案をしておりまして、しかも、コンパイルが必要な言語はイマイチ要件にあわない。初めは IronRuby でやろうかと思ったのですが、調べたところ日本語の扱いに不安がある。ここはそろそろ安定しているであろう IronPython かな?というわけ。

さて、本題。インタラクティブシェルを便利にする、ipy.exe おすすめの起動時オプションをご紹介。
どんなオプションがあるのかはこんな感じで確認できます。

C:\Users\murave>"C:\Program Files\IronPython 2.6 for .NET 4.0\ipy.exe" -?
Usage: ipy.exe Usage: ipy [options] [file.py|- [arguments]]

Options:
 -3                       Warn about Python 3.x incompatibilities
 -c cmd                   Program passed in as string (terminates option list)
 -D                       Enable application debugging
 -E                       Ignore environment variables
 -h                       Display usage
 -i                       Inspect interactively after running script
 -m module                run library module as a script
 -O                       generate optimized code
 -OO                      remove doc strings and apply -O optimizations
 -Q arg                   Division options: -Qold (default), -Qwarn, -Qwarnall,
-Qnew
 -s                       Don't add user site directory to sys.path
 -S                       Don't imply 'import site' on initialization
 -t                       Issue warnings about inconsistent tab usage
 -tt                      Issue errors for inconsistent tab usage
 -u                       Unbuffered stdout & stderr
 -v                       Verbose (trace import statements) (also PYTHONVERBOSE=
x)
 -V                       Print the version number and exit
 -W arg                   Warning control (arg is action:message:category:module
:lineno)
 -x                       Skip first line of the source
 -X:AutoIndent            Enable auto-indenting in the REPL loop
 -X:ColorfulConsole       Enable ColorfulConsole
 -X:CompilationThreshold  The number of iterations before the interpreter starts
 compiling
 -X:Debug                 Enable application debugging (preferred over -D)
 -X:EnableProfiler        Enables profiling support in the compiler
 -X:ExceptionDetail       Enable ExceptionDetail mode
 -X:Frames                Enable basic sys._getframe support
 -X:FullFrames            Enable sys._getframe with access to locals
 -X:GCStress              Specifies the GC stress level (the generation to colle
ct each statement)
 -X:LightweightScopes     Generate optimized scopes that can be garbage collecte
d
 -X:MaxRecursion          Set the maximum recursion level
 -X:MTA                   Run in multithreaded apartment
 -X:NoAdaptiveCompilation Disable adaptive compilation
 -X:PassExceptions        Do not catch exceptions that are unhandled by script c
ode
 -X:PrivateBinding        Enable binding to private members
 -X:Python30              Enable available Python 3.0 features
 -X:ShowClrExceptions     Display CLS Exception information
 -X:TabCompletion         Enable TabCompletion mode
 -X:Tracing               Enable support for tracing all methods even before sys
.settrace is called

Environment variables:
 IRONPYTHONPATH    Path to search for module
 IRONPYTHONSTARTUP Startup module

お勧めは、TABキーでのキーワードの補完が有効になる「-X:TabCompletion」、自動でインデントしてくれる「-X:AutoIndent」、コンソールがカラーになる「 -X:ColorfulConsole」あたり。昔はTabCompletion と AutoIndent は設定すると問題もあったのですが(TabCompletion では日本語が文字化けするとか)なおっているようです。

これらのオプション、3年前に買った『オープンソース×Windowsスクリプティング IronPythonの世界』(荒井 省三)という本で知ったのですが、いまだにこの本ぐらいしか参考書がないみたい。

私は、スタートメニューの IronPython Console のショートカットをコピーしてリンク先に上記のオプションを追加したショートカットを作ってます。便利ですよ。

切れちゃってますが、リンク先の内容は「”C:\Program Files\IronPython 2.6 for .NET 4.0\ipy.exe” -X:TabCompletion -X:AutoIndent -X:ColorfulConsole」です。ipy.exe の Path については調整してくださいね。

Facebooktwittergoogle_pluslinkedintumblrmail