« [ linux / lisp ] Lisp 風の強力なシェル Lush | トップページ | [ linux / ubuntu ] Edgy から Feisty にアップグレードする方法 »

2007/04/20

[ python ] 続 IronPython1.1

IronPython 1.0 では、socket モジュールは builtin モジュール ( 標準ライブラリと呼ばれることもあります ) として用意されているものの、それから作成した socket オブジェクトには makefile() メソッドが実装されていませんでした。makefile() がないため、socket オブジェクトに依存するモジュール、たとえば urllib などが利用できないという欠点に繋がっていました。 IronPython1.0 で makefile() を呼び出そうとすると次のようにエラーになってしまいます。

C:\dev>ipy -X:Python25
IronPython 1.0 (1.0.61005.1977) on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import socket
>>> socket
<module 'socket' (built-in)>
>>> test_socket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
>>> test_socket.connect( ("quux.org", 70) )
>>> pseudo_file = test_socket.makefile( "rw", 0 )
Traceback (most recent call last):
  File , line 0, in <stdin>##93
AttributeError: 'socket' object has no attribute 'makefile'

IronPython1.1 のリリースノートを見ると "Socket implements makefile function ( socket に makefile メソッドを実装した )" とあります。 IronPython1.1 で同じ操作を行ってみました。

C:\dev\IronPython-1.1>ipy -X:Python25
IronPython 1.1 (1.1) on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import socket
>>> socket
<module 'socket' (built-in)>
>>> test_socket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
>>> test_socket.connect( ("quux.org", 70) )
>>> pseudo_socket = test_socket.makefile( "rw", 0 )
>>> pseudo_socket.write( "index.txt\r\n" )
>>> for data in pseudo_socket.readlines():
...     print data
...
3'/index.txt' does not exist (no handler found)         error.host      1

1.0 では「socket オブジェクトには makefile という名前の属性は存在しない」というエラーが出ていますが、1.1 ではそれがありません。1.1 のコードのエラーは「指定された名前のファイルが存在しない」というもので makefile とは関係がないものです。

socket に依存するモジュールはいくつかあり、それらは IronPython1.0 では利用できないことも多かったのですがどうなっているでしょうか? urllib で試してみます。まずは 1.0 で確かめます。コードは IronPython の世界 で 1.0 では動かないとされているものです。

X:\>ipy -X:Python25
IronPython 1.0.60816 on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import sys
>>> import urllib
>>> import urlparse
>>> url = "http://www.python.jp/pub/doc_jp/pdf-a4-2.4.zip"
>>>
>>> filename = urlparse.urlparse( url )[2].split( '/' )[-1]
>>>
>>> filename
'pdf-a4-2.4.zip'
>>> urllib.urlretrieve( url, filename )
Traceback (most recent call last):
  File , line 0, in <stdin>##134
  File C:\SDK\Python\Lib\urllib.py, line 89, in urlretrieve
  File C:\SDK\Python\Lib\urllib.py, line 222, in retrieve
  File C:\SDK\Python\Lib\urllib.py, line 194, in open
  File C:\SDK\Python\Lib\urllib.py, line 272, in open_http
  File , line 0, in __import__##4
  File C:\SDK\Python\Lib\httplib.py, line 70, in Initialize
  File , line 0, in __import__##4
  File C:\SDK\Python\Lib\mimetools.py, line 6, in Initialize
  File , line 0, in __import__##4
  File C:\SDK\Python\Lib\tempfile.py, line 33, in Initialize
  File , line 0, in __import__##4
  File C:\SDK\Python\Lib\random.py, line 41, in Initialize
  File , line 0, in __import__##4
  File C:\SDK\Python\Lib\warnings.py, line 264, in Initialize
NameError: name 'ImportWarning' not defined
>>>

おや、IronPython の世界 とは違うエラーになりました。4 台の PC でそれぞれで実行しましたが、全てこのエラーになります。それでも 1.0.1 では動作しないことは確認できました。このエントリの目的は IronPython1.1 で互換性が向上したかどうか、少なくともリリースノートにある互換性を確認することなので原因解明はせず次に進むことにします。同じ環境で IronPython だけを 1.1 に変更して同じコードを実行してみます。

X:\>ipy -X:Python25
IronPython 1.1 (1.1) on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import sys
>>> import urllib
>>> import urlparse
>>> url = "http://www.python.jp/pub/doc_jp/pdf-a4-2.4.zip"
>>>
>>> filename = urlparse.urlparse( url )[2].split( '/' )[-1]
>>>
>>> filename
'pdf-a4-2.4.zip'
>>> urllib.urlretrieve( url, filename )
('pdf-a4-2.4.zip', <httplib.HTTPMessage instance at 0x000000000000002B>)
>>>

エラー・警告が出ることなく動作しました。フォルダを確認するとちゃんと ZIP ファイルが作成されています。

あとめぼしいものは md5, sha, select モジュールの追加でしょうか。md5 などのハッシュモジュールはいままでも .NET Framework のものを使うことで代用できたのですが、CPython と同じように使えるようになったことは、コードポータビリティの面でもうれしいです。しかし、わたしが確認した限りでは IronPython1.1 の md5 モジュールは CPython のそれと完全な互換性があるわけではないようです。オブジェクトが持つ属性が異なるだけでなく、コードを走らせたところエラーが出てしまうものもありました。

.NET Framewrok で動作する言語の中では、IronPython は C# などに比べるととても扱いやすい言語です。実際、C# よりも格段に学習しやすく扱いやすい言語です。CPython と互換性を持ちつつ、.NET との親和性を併せ持つこの言語はこれからどんどん発展していくでしょう。わたしも少しずつですが使用する機会が増えてきています。気付きたことがあったらここで書いていきたいと思います。

|

« [ linux / lisp ] Lisp 風の強力なシェル Lush | トップページ | [ linux / ubuntu ] Edgy から Feisty にアップグレードする方法 »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [ python ] 続 IronPython1.1:

» ニシキヘビと戯れる。 [50万円から小豆御殿 〜商品先物取引ブログ]
ここ半年くらい、某機関の商用ソルバーをタダで使わせてもらっているのだが、スクリプトがPythonという言語で書ける。また、簡単なシミュレーションであれば、Pythonの対話モードで関数を呼び出してその場で計算することも出来る。 僕はプログラミングのセンスがなく、VBA...... [続きを読む]

受信: 2007/05/17 04時39分

« [ linux / lisp ] Lisp 風の強力なシェル Lush | トップページ | [ linux / ubuntu ] Edgy から Feisty にアップグレードする方法 »