2011年9月9日 星期五

[python]python on mac

我還記得以前,在 mac 上要跑 python,不是很開心。
因為 mac 上的 python 版本舊很多。
所以要另外裝所謂的 macpython 才有比較新的。
而且,裝了之後,在 finder 裡點兩下,應該啟動的 python 程式,也不正常。
另外,在 windows 底下寫的程式,無法直接拿到 mac 下執行,
原因居然是換行符號的問題。
因此,我隔了很久都不再 mac 上使用 python。

我去年裝了 mac OS 10.5 之後,我也一樣沒再去想 python 的問題。
最近想把一些每天要執行的程式搬到 mac 上,才能每天有股票資訊可看。
才突然發現,它居然更新到 python 2.7 了,而且,
在 console 底下,打 python xxx.py 也可以順利執行,沒有換行的問題了。
(雖然直接執行還是有問題,因為沒有加上 !#/bin/python)
(直接點兩下也沒辦法執行,這個問題我還沒有找出來)
這樣,就讓我很開心了。

原本,還想說,要不要把 python 程式轉成 jython 可用之後拿到 mac 上執行,
看來除非程式執行需要gui,否則我可以不用花這麼大的工夫了。
哈哈。

[jython]json到哪兒去了?(2)

經過了一段掙扎,回頭再看一下jyson的文件。
http://opensource.xhaus.com/projects/jyson/wiki/JysonUserObjects
這裡面提到,要輸出自己的 class 就要實作 __json__() 這個 method。

回頭再測試一下,jyson 的 loads 及 dumps 根本不看 object_hook 及 cls 的參數。
那麼,
a = json.loads(b,object_hook=ext.as_orderdict)
這個 a 只是一個 dict,所以,要自己再產生物件,於是乎從檔案讀回來就要改成

f = open(json_filename,'r')
  b = f.read()
  f.close()
  a = json.loads(b,object_hook=ext.as_orderdict)
  if sys.version.find('Java')>-1:
    c = ext.OrderDict()
    c.list = a['list']
    c.dict = a['dict']
    a = c
  return a

還有,物件  的定義裡要加上 __json__(self) 的方法。

def __json__(self): # for jyson
    return u"""{'list':%s,'dict':%s}""" % (json.dumps(self.list),json.dumps(self.dict))

文件中,說明一定要回傳 unicode 的字串。

呼,終於搞定了。

[jython]json到哪兒去了?

看著 python 2.6.5 可以快樂的使用 json,
jython 卻還不行使用。
網路上有 jyson,雖然他的用法已經很接近 python 的,
但是,就是不一樣,就是會遇到:

class OrderDictEncoder(json.JSONEncoder)

JSONEncoder 不在 jyson,所以沒辦法照用。

唉~~~,事情不會這麼美好。

以下就開始改變程式,讓 python 及 jython 都能用。

(1)
import sys
if sys.version.find('Java')>-1:
  import com.xhaus.jyson.JysonCodec as json
else:
  import json

(2) 這一段我超喜歡的,條件式的宣告在 python 及 jython 裡,就跟寫程式沒兩樣。讚!
if sys.version.find('Java')>-1:
  import com.xhaus.jyson
  class OrderDictEncoder(com.xhaus.jyson.JysonEncoder):
    def default(self, obj):
      if isinstance(obj, OrderDict):
        return {'list':obj.list,'dict':obj.dict}
      return com.xhaus.jyson.JysonEncoder.default(self, obj)
else:
  class OrderDictEncoder(json.JSONEncoder):
    def default(self, obj):
      if isinstance(obj, OrderDict):
        return {'list':obj.list,'dict':obj.dict}
      return json.JSONEncoder.default(self, obj)

(3) 因為 jyson 不支援 load 及 dump,只有 loads 及 dumps,所以全改成 loads 及 dumps。
例如:
f = open(json_filename,'r')
a = json.load(f,object_hook=ext.as_orderdict)
改成:
f = open(json_filename,'r')
b = f.read()
a = json.loads(b,object_hook=ext.as_orderdict)

但是…天不從人願…
    b = json.dumps(result,cls=ext.OrderDictEncoder)
        at com.xhaus.jyson.JysonEncoder.append_json_repr(Unknown Source)
        at com.xhaus.jyson.JysonEncoder.json_repr(Unknown Source)
        at com.xhaus.jyson.JysonCodec.dumps(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)

java.lang.ClassCastException: java.lang.ClassCastException: org.python.core.PyCl
ass cannot be cast to org.python.core.PyType

這個我就不知道該怎麼辦才好啦…
jython 還是跑不過去…

[python][jython]關於Exception的不同

在 python 裡以下的敘述可用

except Exception as ex:

但是,在 jython 卻會出問題:

except Exception as ex:
SyntaxError: mismatched input 'as' expecting COLON

耶~~~~

http://jythonpodcast.hostjava.net/jythonbook/en/1.0/ExceptionHandlingDebug.html

經過查詢上列網頁,jython 2.5.2 還不支援這種寫法。

那就只好先寫舊寫法。

except Exception , ex:

擋著先。