« [Python S60 2.0.0] e32.Ao_lock.Signal() の問題 | トップページ | Nokia 5800 XM のファームウエアを更新、、失敗だったかな »

2010年11月24日 (水)

[Python S60 2.0.0] 今回のまとめ

2010-11-24(水)曇り、のち晴れ

 今回弄った[Python S60 2.0.0]の、自分用のメモです。

 All Files化できないNokia E52 でも使ってみました。Python 2.0.0が最初に立ち上がるときに読むフォルダはC:\Private や C:\Resource\Python25 、C:\Resource\Python25より下のフォルダです。しかし、All Files化してないので、sitecustomize.py をC:\Resource\Python25に書き込むことも出来ず C:\Resource\Python25\Python25.zip を変更することも出来ません。従って、sys.setdefaultencoding('utf-8') を実行させることが出来ません。

 なので、Python 2.0.0 をインストールしたままの素の状態(昨日の変更を加えない状態)で使うときは、フォルダ名やファイル名に日本語名があるフォルダ内容は簡単には扱えません。また、文字のエンコードやデコードには気をつける必要があります。

 (site.pyについての一考察:一番下の----以下の注です。)

 ということで、Python S60 V.2.0.0 も考慮してスクリプトを作成するときは、以下の点に気をつける必要があります。

(1)携帯電話内のフォルダ名やファイル名には日本語名を使わない(英数字のみ使用する)。
(こうしないとPythonのファイルブラウザでフォルダ内を見られなかったり、フォルダやファイル選択をさせるサブモジュールでファイルが見られなかったりするためです。)

(2)sys.setdefaultencoding('utf-8')を使用しない(エラーになる)。

(3)文字データをunicodeへ変換するときは、きちんとデコード方式を指定する。

  例えばPython 1.4.x では使えた (a)はエラーになるので、今後使用しないで
  (b)(c)を使用する。
    (a) uni_data = unicode(utf8_data)     今後使用しない。
   (b)  uni_data = unicode(utf8_data, 'utf-8')
   (c)  uni_data = utf8_data.decode('utf-8')

(4)unicode文字データをUTF-8やShift-JISへ変換するときも注意する。
 Python 1.4.5x の時
  (a)utf8_data = uni_data.encode('utf-8')
  (b)sjis_data = uni_data.encode('japanese.Shift-JIS')

 Python 2.0.0の時
  (c)utf8_data = uni_data.encode('utf-8')
  (d)sjis_data = uni_data.encode('Shift-JIS')

(b)(d)についての注:
 Python 2.0.0ではjapaneseモジュールを指定する必要はない。逆に、今までのjapaneseモジュールを指定するとエラーになる。
従って、どちらの記述にするかはPythonのバージョンを判定して切り分けるか、Pythonのバージョン毎にスクリプトを分ける必要がある。

(5)スクリプト内でのテキストはユニコードに変換して、すべてユニコードで処理するのがよい。画面へのプリントアウト(print )で指定するのもユニコードデータにすること。

(6)Python 2.0.0ではsys.argv が参照できない。今まで通り参照するとエラーになるので、これも使用しないようにする必要がある。

 テキストのエンコード、デコード関係やprint 、file出力のテスト結果をまとめてみました。分かりにくい表ですが、自分用のメモです。

Python_test01 画像はクリックして拡大して見て下さい。

 EXCELの表はこちら:「python_test01.xls」

(7)昨日書いた、e32.Ao_lock().signal() でPythonごとダウンする件は未解決なので、今のところ使うのは難しい。

 ここ何日かで勉強した内容は以上の通りです。

-----------------------------------------------------------------------
注(site.pyについて)
 今回のバージョンでsys.setdefaultencoding が使用できないのは、私からみるとデグレードかなと思います。それは、文字のデコード/エンコードは方式指定で済むけど、フォルダ名やファイル名に英数字しか使えなくなったので、今までのフォルダ名やファイル名を変えないといけないからです。スクリプトの中に記述してしまっているフォルダ名もありますから、変更は面倒です。

 以前のPythonで、site.pyを簡略化してsetdefaultencoding()アトリビュートを削除しないようにして、スクリプトで setdefaultencoding を使用できるようにしていたのはバグではなく、それなりの配慮だったのではないかと思います。なぜなら、Python(のsite.py)が最初に参照しているフォルダは、携帯電話の場合ユーザが書き換えできないフォルダです。即ち、ユーザはsitecustomize.py が書き込めないから、Python起動時にsite.pyでsitecustomize.py を読んでsetdefaultencoding を実行することが出来ないからです。

 今回のバージョンの site.pyはPC版Pythonと同じく、そのままの処理が使われているのでしょうが、PCではPythonをインストールしたフォルダもユーザが読み書きできてsitecustomize.py を書き込めるのですが、携帯電話では書き込めないのです。従って、今回のテスト結果のように、setdefaultencodingを実行させるところが無くなってしまったわけです。PC版に忠実に近づけたのですが、以前されていた配慮が抜けたのではないかと思うわけです。

 開発チームのフォーラムやボードを読んでいないので、この辺は多分に独断と偏見に満ちた見方かもしれません。その点は、平にご容赦、、。
-------------------------------------------------------------------------

 

|

« [Python S60 2.0.0] e32.Ao_lock.Signal() の問題 | トップページ | Nokia 5800 XM のファームウエアを更新、、失敗だったかな »

Python」カテゴリの記事

携帯電話」カテゴリの記事

コメント

ご無沙汰しております。
手前で検証できないので言いっぱなしになってしまいますが、symbianアプリケーションは
C:\Private\自分のUID\
が読み書きできるはずです。したがって
C:\Private\python自体のUID\・・・
をpythonが立ち上がり時に読みにいくとすれば、この中にsite.pyを作成するpythonスクリプトを書いて、それをscriptshellから実行すればsys.setdefaultencodingが呼べたりしないでしょうか?
ひょっとしたらもう試されているかもしれませんし、上手く説明できていない気もしますが、よろしければ試してみてください。

投稿: ayamadori | 2010年11月25日 (木) 00時45分

お久しぶりです。
今読んだ瞬間では半分くらいの理解ですが、何となく言われていることは分かりました。sitecustomize.pyではなくsite.pyを作成するんですね。試してみます。

投稿: masa | 2010年11月25日 (木) 12時09分

あ、site.py → sitecustomize.py の間違いかもしれません(苦笑)すみません。

投稿: ayamadori | 2010年11月25日 (木) 20時53分

ヒント、ありがとうございました。
site.py、sitecustomize.py 両方ともやってみました。フォルダ内への作成(コピー)は出来ましたが、sys.setdefaultencodingは実行されませんでした。
また、E:\Private\python自体のUID\...のPythonのdefault.pyを変更したり、E:\Private\python自体のUID\lib.zip にsite.pyを入れたりしましたが駄目でした。

ひとつだけ、抜け道を見つけました。sys のreloadです。これをやったあとはsys.setdefaultencodingが実行できました。
数日内にテスト内容を記事にする予定です。

投稿: masa | 2010年11月25日 (木) 21時37分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/513620/50113222

この記事へのトラックバック一覧です: [Python S60 2.0.0] 今回のまとめ:

« [Python S60 2.0.0] e32.Ao_lock.Signal() の問題 | トップページ | Nokia 5800 XM のファームウエアを更新、、失敗だったかな »