« 松本時計博物館 | トップページ | [Python S60 2.0.0] sys.setdefaultencoding('utf-8') 実行の件3 »

2010年11月28日 (日)

[Python S60 2.0.0] sys.setdefaultencoding('utf-8') 実行の件2

2010-11-28(日)晴れ

 Python 2.0.0でsys.setdefaultencoding('utf-8') を実行させることが出来ない件について、先日の記事に、あやまどりさんからコメントでヒントを戴きました。
  記事とコメントはこちらです。「[Python S60 2.0.0] 今回のまとめ

 このコメントをヒントに色々テストしました。その結果を、自分のメモ用にまとめてみました。以下の記事は、次のようになっています。

 1.コメント内容により試行したが駄目だった内容
 2.EメモリにPythonをインストールしたE52で行った追加テスト1
 3.EメモリにPythonをインストールしたE52で行った追加テスト2
 4.見つけた抜け道

の4章立てです。

 さて、あやまどりさんから戴いたヒントの内容は、自分なりに整理すると以下のようになります。
----------------------- コメント内容まとめ ------------------------------
 symbianアプリケーションは C/E:\Private\自分のUID\...(注1) フォルダが読み書きできるはずです。(例:C/E:\Private\e788idfa\・・・  以下、この表記を用います。)
 従って、pythonが立ち上がり時に、C:\Private\e788idfa\・・・ を読みにいっていると仮定すると、以下のようにすることで、sys.setdefaultencoding('utf-8') を実行させることが出来るのではないでしょうか。
 「C/E:\Private\e788idfa\・・・の中に sitecustomize.py を作成するpythonスクリプトを作って実行させ、C/E:\Private\e788idfa\・・・の中に sitecustomize.py を作成しておけば、pythonが立ち上がり時に sys.setdefaultencoding('utf-8') を実行させることが出来るのではないでしょうか。」

 注1:コメントでは C:\Private\自分のUID\... と有りましたが、PythonをC:メモリにインストールした場合は主にC:\Private\自分のUID\...が、PythonをE:メモリにインストールした場合は主にE:\Private\自分のUID\...が使用されるので、両方を対象に考えることにします。
-----------------------------------------------------------------------

 Pythonを立ち上げた直後にスクリプトで「print  sys.path 」実行してみるとsys.pathの内容は以下の通りです。
・C:メモリにPythonをインストールした場合:
 ['C:\\Private\\e7881dfa\\lib.zip', 'c:\\resource\\python25\\python25.zip', 'c:\\resource\\python25', 'e:\\python\\lib']

・E:メモリにPythonをインストールした場合:
 ['E:\\Private\\e7881dfa\\lib.zip', 'c:\\resource\\python25\\python25.zip', 'c:\\resource\\python25', 'e:\\python\\lib']

C/E:\\Private\\e7881dfa\\lib.zip は入っているのですが、C/E:\\Private\\e7881dfa\\ フォルダ自身が入っていないので、難しいかもしれません。

 さて、上のコメントを元に、いくつかテストしました。

1.コメント内容により試行したが駄目だった内容
  (1)E:\Private\e788idfa\・・・ へ sitecustomize.py をスクリプトでコピーする。
  (2)E:\Private\e788idfa\・・・ へ site.py をスクリプトでコピーする。
  (3)C:\Private\e788idfa\・・・ へ sitecustomize.py をスクリプトでコピーする。
  (4)C:\Private\e788idfa\・・・ へ site.py をスクリプトでコピーする。

  注: site.py は、setdefaultencodingアトリビュート削除をやめるよう改造したもの。
     以下のテストも同じです。

  上記(1)~(4)をひとつずつ実行し、その都度「Filebrowser.py」、「Filebrowser2.py( sys.setdefaultencoding('utf-8') を削除したもの)」を実行して見ました。結果としては、ファイルのコピーは正しく実行されました(後でメモリ内容を見ると、ちゃんと入っていました)。
 しかし、「Filebrowser.py」を実行すると「setdefaultencodingアトリビュートがない、、」、「Filebrowser.py2」を実行すると「フォルダ内が表示されない、、」という、以前と同じエラーが発生します。即ち、C/E:\Private\e788idfa\・・・ の中身は参照されていないようでした。

2.EメモリにPythonをインストールしたE52で行った追加テスト1
(1)E:\Private\e788idfa\・・・ の中にある Python 自身の default.py に
   フォルダパスを追加し、そのフォルダ内に sitecustomize.py を入れる。
 -> 「Filebrowser.py2」を実行すると、フォルダ内容が表示されない。NG

(2)E:\Private\e788idfa\・・・ の中にある Python 自身の default.py に
  フォルダパスを追加し、そのフォルダ内に site.py を入れる。
  -> 「Filebrowser.py」を実行するとsetdefaultencodingアトリビュートが
   ないエラーになる。NG

  default.py でのフォルダパス追加では遅いようです。


3.EメモリにPythonをインストールしたE52で行った追加テスト2
 sys.pathに E:\\Private\\e7881dfa\\lib.zip が入っているので、lib.zipの中に入れて見ることにしました。
(1)E:\\Private\\e7881dfa\\lib.zipの中に sitecustomize.pyをマージして入れる。
  -> 「Filebrowser.py2」を実行すると、フォルダ内が表示されない。

(2)E:\\Private\\e7881dfa\\lib.zipの中に site.pyをマージして入れる。
  -> 「Filebrowser.py」を実行するとsetdefaultencodingアトリビュートがないエラーになる。

 E:\\Private\\e7881dfa\\lib.zipも参照されていないようでした。


4.見つけた抜け道
 本来、sysモジュールには setdefaultencoding() アトリビュートは入っています。それが、site.py のなかで削除処理が行われているだけです。従って、このアトリビュートを、何とかして使えるようにすればいいわけです。

 しかし、たんに新たに import するだけでは駄目です。何回 importしても、2回目以降は処理されません。これは、処理速度を上げるための工夫です。既に importされているものを新たに処理する無駄を排しているわけです。そして、sysモジュールは、Python立ち上がり時に importされて、しかも setdefaultencoding() アトリビュートが削除されています。

 そこで、無理矢理読み込ませる手はないのか、、と、既に買ってあった分厚い解説本「初めてのPython 第3版」を読んで、見つけました。強制的に読み込ませるには「リロード(reload)」です。

 今までに作成した各スクリプトの先頭の部分を変更します。

-- 今までのもの --------------
import sys
sys.setdefaultencoding('utf-8')
-----------------------------

-- 新しい内容 ----------------
import sys
reload (sys)
reload(sys)
sys.setdefaultencoding('utf-8')
-----------------------------

 これで実行してみると、同じスクリプトでPython 1.4.5 でも Python 2.0.0 でも同じように動きました。

 本当は次のようにするのが良いのかもしれません。
-----------------------------------
import sys
if not hasattr(sys, "setdefaultencoding"):
    reload (sys)
    reload(sys)
sys.setdefaultencoding('utf-8')
-----------------------------------

 これで、この件に関しては何とか、今までのスクリプトも大きく変更しなくても良くなりました。しかし、e32.Ao_lock().signal() でPython自身が落ちてしまう件は、まだ未解決です。

 

|

« 松本時計博物館 | トップページ | [Python S60 2.0.0] sys.setdefaultencoding('utf-8') 実行の件3 »

Python」カテゴリの記事

アプリケーション」カテゴリの記事

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

コメント

コメントを書く



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




トラックバック

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

この記事へのトラックバック一覧です: [Python S60 2.0.0] sys.setdefaultencoding('utf-8') 実行の件2:

« 松本時計博物館 | トップページ | [Python S60 2.0.0] sys.setdefaultencoding('utf-8') 実行の件3 »