2012年2月11日土曜日

Python を勉強したのでメモ

1月はPythonを弄りました
Pythonについて知っていたのは「インデントが文法の一部である」というコトだけでした。
で、「PHPと大体同じだろ!」と思っていたので、参考書は買わずにトライ&エラーで試すコトに決めました。

同時に他の勉強もしてたので全然進まなかった&参考にしたサイトもどっかいっちゃたんですが…。
次にPythonを勉強するのは十カ月くらい後の予定なので、一旦備忘録としてメモします。
(勉強不足のため、内容が間違っている可能性があります)

このエントリの目次
1.環境構築
2.ブラウザからアクセスしてみる
3.ログ出力の仕方
4.何かのWeb APIを叩いてみる
5.XMLの処理の仕方
6.まとめ

1.環境構築
Ubuntu 11.10上で環境構築しました。
バージョンは2.7.2 です。

インスコ作業したのかしていないのか忘れてしまいました。
で、Apacheの設定をゴニョゴニョしました。
もはやうろ覚えなのですが、/etc/apache2/sites-available/default の一部を変更しました。
以下が現状(抜粋)
    <Directory /var/www/>
        AddDefaultCharset utf-8
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All 
        Order allow,deny
        allow from all

        AddHandler mod_python .py 
        PythonHandler mod_python.publisher
        PythonDebug On
    </Directory>

2.ブラウザからアクセスしてみる
ここでいきなりハマった記憶があります。
どうハマったかと言うと、ブラウザから実行できない!

僕は以下のようにアクセスするコトで実行できるようになりました。

Pythonのファイルが以下のパスにあるとき。
/var/www/test/index.py

ブラウザから以下のURLでアクセスできる。
http://localhost/test/index/hoge

このとき、index.pyの中身は以下の感じ。
#!/usr/bin/python
# -*- coding: utf-8 -*-
def hoge():
    return 'Hello world!'

URLのindexにてファイル名を指定しているようです。
(http://localhost/test/index.py/hoge としてもアクセスできました)

で、URL末尾のhogeが、実行したい関数名を指定しているようです。
URLで関数名を指定しない場合(つまりhttp://localhost/test/indexとした場合)、Pythonのファイルにdef indexが記述されていたら、そのindex関数が実行されるようです。

3.ログ出力の仕方
PHPなら「error_log()」で一発ですが、Pythonはそうはいかない様子。

以下のように書いたら/var/log/apache2/error.logに「hoge」とログ出力されました。
#!/usr/bin/python
# -*- coding: utf-8 -*-

import logging #Javaのimport文と同じ感じ?

def index():
    logging.getLogger().setLevel(logging.DEBUG)
    logging.debug('hoge')

いちいちlogging.debug()と書くのがめんどいので、僕は以下のようにdebug関数を定義しました。
#!/usr/bin/python
# -*- coding: utf-8 -*-

import logging

def index():
    logging.getLogger().setLevel(logging.DEBUG)
    debug('hoge')

def debug(message):
    logging.debug(str(message))

4.何かのWeb APIを叩いてみる
かなり簡単でした。
以下のようなコードでWeb API叩けました。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import logging
from urllib import urlopen

def index():
    d = urlopen("http://www.example.jp/web/some/api")
    debug(d.read())

def debug(message):
    logging.debug(str(message))

APIのレスポンスがログに出力されました。

Cookie付けるときはどうするのかなあ。

5.XMLの処理の仕方
知識が足りないのでうまく説明できません(白目)
[python]XMLをパースする | wonder on server sideを参考にさせて頂きました。

が、ここでも2点ほどハマりました。

まず、一点目。
xml = ElementTree(file=open(URLアドレス))

を2行に分けたりしない!
下記のように2行に分けると謎のエラーが出て実行できませんでした。
file = urlopen(URLアドレス)
xml = ElementTree(file)

次に2点目。
日本語の要素をログを出力するときは、下記のようにencode文を記述する必要があるようです。
debug(node.text.encode('utf-8'))

そうしないと、以下のようなエラー文が出ます。
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)

6.まとめ
改めて、あんまり進まなかったなあ…。

あとはClassの作り方、自作クラス/関数をimport?する方法、DBとの接続方法が分かれば開発ができるかな?
次にPythonをいじるときはWebフレームワークのDjangoを使ってみようと思っています。

0 件のコメント:

コメントを投稿


Related Posts Plugin for WordPress, Blogger...