2014年11月8日土曜日

Python2対Python3

世の中、Python2が健在で、まだまだ現役です。

と言うことでサーバ側の実装も、Python2とPython3の両方を作りました。

で…、 けっこう面倒くさいです。

 サーバはWindowsとLinuxの両方を想定しているので結局

(WindowsとLinux)×(Python2とPython3) の4種類を作る羽目になりました。

以下、僕が今回出くわした、Python2とPython3の違いを紹介します。


物はCGIスクリプトです、OSはubuntuです。

---------------------------------------
まず、インタプリッタの場所が違う。

Python2だと
#!/usr/bin/python

Python3だと
#!/usr/bin/python3

これはまー、仕方ないかな(- -)

---------------------------------------
printが違います。

Python2だと
print txt

Python3だと
print(txt)

これはpython3が出たときに最初から言われていたことなので仕方ないかな(- -)
---------------------------------------
Python3では問題なく動くのですが、Python2ではエラーが出ました。


 UnicodeEncodeError: 'ascii' codec can't encode characters in position 5601-5602: ordinal not in range(128)\r



これはアスキーコードでは無いと言っているようです。

頭で以下の様に宣言はしているのですが 、UTF-8として扱ってくれません。
# -*- coding: utf-8 -*-


しかたがないので。

Python2だと
sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
print (txt)


Python3だと
print (txt)
---------------------------------------
今度はと動かすと、 バイトデータで日本語が文字化けします。
しかたがないので、明示的にUTF-8だと指定しました。
下記の例では、inMsgがバイト配列です。

Python2だと
sql = sql+",'"+inFile.decode('utf-8')+"'"


Python3だと
sql = sql+",'"+inFile+"'"

---------------------------------------
CGIのデバック用サーバが違う。
pythonにはデバック用の簡易CGIサーバが標準で付いています。

 Python2だと
 コマンドラインで、実行します。

python -m CGIHTTPServer

Python3だと
以下の2行だけのプログラムを作り実行します。
 import http.server
http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler)

いずれもカレントのディレクトリ配下にディレクトリcgi-binを置くとその中のCGIスクリプトが実行されます。

--------------------------------------

なんとか、やっとこさ、動く様になりました。 よくPython3でなくてもPython2で十分と言う話をWeb上で見かけます。 

欧米人に多い気がします。

私見ですがそれは、ASCIIコードで事足りる人々の話だと思います。 
亜細亜に住む人々はPython3 をつかうべきです



Androidのアプリ「酔いから醒めるまで」をフリーで出していました。
久々に、これを忘年会シーズンに向けてメンテナンスしようと思いeclispを立ち上げると、なぜかコンパイルエラーが出ます。いままで、せいぜいAndroidSDKManagerで更新したぐらいなのですが。

まるで、 真夜中に森の中で100m走をやっているみたいです、スタートしてはゴチン、ダッシュしてはゴチン。









0 件のコメント:

コメントを投稿