Python」カテゴリーアーカイブ

Pythonのバージョンを取得するだけのお話

Pythonのバージョンを取得しなければならなくなった。
まあ、シェルからこうやればいいじゃん。

$ python -V
Python 2.6.5

そうだね、シェルからならね…

実はPythonスクリプト実行中にテメーが動いているPythonのバージョンを取得したいのだ。
さてはて、os.system()なんて禍々しくもマヌケで恐ろしいことをしなければダメなのかとも思ったが、そんな訳はないとグーグル様にお伺いを立ててみたところ、ちゃんと用意してあるじゃんと解決。
sysモジュールversion_infoを使えばいいんだ。

$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.version_info
(2, 6, 5, 'final', 0)

ふぅ、ちゃんと取れたぜ。マヌケなことをせずに済んだ…

Pythonに組み込まれたSQLite3のバージョンを知る方法

ふつーSQLite3のバージョンはコマンドラインで簡単にわかりますね。

$ sqlite3 -version

それではPythonに組み込まれているSQLite3のバージョンを確認する方法は?

きっとsqlite3モジュールのversion()とかで取れるんじゃねーかと思い、チャレンジしてみた。

>>> import sqlite3
>>> sqlite3.version
'2.6.0'

おいおい、SQLite3だろ、と思ったけど、これはPythonのsqlite3モジュールのバージョンだったよ。てへぺろ。

ということで、今度はSQL経由で調べられるはずだ、と思いつき、まじめにSQLite3のドキュメントを読んで見つけた。
selectでsqlite_version()を使え!
ということで、こうなりました。

>>> import sqlite3
>>> con = sqlite3.connect(':memory:')
>>> con.execute('select sqlite_version()').fetchone()
(u'3.7.7',)

やったぜ、3.7.7だぜ。

ムダに時間を費やした割には、あんまり使い道がないネタでございました。

PythonでGmailにメール送信してみた

Pythonでメールを送信する簡単なお仕事があったので、自分用メモ。
気付いたら自分のメール環境はGmail依存になっていて、SMTPサーバがGmailの奴しかなかった。
ということはSMTP over SSL。STARTTLS!
ふつーのSMTPサーバならいくらでも相手したことあるけど、こいつははじめてだぜ。ヒャッハー。
グーグル様にお伺いを立ててみたところ、Pythonでは最初から対応してた。
smtplibemailを使えば、実に簡単に書けちゃった。
コードはこんな感じでOK。

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

import smtplib
from email.MIMEText import MIMEText
from email.Utils import formatdate
from email.Header import Header

# gmailにログインするときのメールアドレス
gmail_address = 'hoge@sample.co.jp'
# gmailにログインするときのパスワード(とっても危険)
gmail_passwd = 'password'

# gmailのSMTPサーバアドレス
gmail_smtp_address = 'smtp.gmail.com'
# gmailのSMTPサーバポート番号
gmail_smtp_port = 587

# 送信元メールアドレス
from_address = 'sender@sample.co.jp'
# 送信先メールアドレスのリスト
to_address = ['recipient1@sample.co.jp', 'recipient2@sample.co.jp', ]

# 件名
subject = u'日本語サブジェクト'

# メール本文
body = u'''
ボディも日本語だよ。
改行も大丈夫だよ。
'''

msg = MIMEText(body.encode('iso-2022-jp'), 'plain', 'iso-2022-jp')
msg['From'] = from_address
msg['To'] = ', '.join(to_address)
msg['Date'] = formatdate()
msg['Subject'] = Header(subject.encode('iso-2022-jp'), 'iso-2022-jp')

smtpobj = smtplib.SMTP(gmail_smtp_address, gmail_smtp_port)
smtpobj.ehlo()
smtpobj.starttls() # こっからSSL
smtpobj.ehlo()
smtpobj.login(gmail_address, gmail_passwd) # ログイン
smtpobj.sendmail(from_address, to_address, message.as_string()) # 送信
smtpobj.close()

日本語対応でちょっと躓いたケド、MIMETextに渡す時に、はじめからISO-2022-JPに変換してエンコードを明示してやればいい。
UTF-8がいい、という人はUTF-8にしてね。

Python用フレームワークwebapp2をいじってみたよ

Python向けのウェブアプリケーションフレームワークはあるのですが、その中からwebapp2をいじってみたのでメモがわりにここに書いてみるぜ。
webappという名前を見て気付いた人もいると思うけど、GoogleAppEngineで使われてるフレームワークなのだ。
webappがPython2.5用の以前からあるフレームワークで、webapp2の方はPython2.7向けの新しいフレームワーク。
さて、このwebapp2。GoogleAppEngine上だけでなく、ふつーのWSGIアプリケーションとして動くんですな。
今回はGoogleAppEngineを使わずにwebapp2をいじってみることにしたよ。

まず最初はwebapp2のインストールなのだが、今回はわけあってモジュールとしてインストールせずに使ってみた。
必要なのは

の3つ。それぞれ最新版のwebapp2-2.5.1.zipWebOb-1.2b3.zipPaste-1.7.5.1.tar.gzをダウンロード。
そいつらをディレクトリext以下で展開しておいておいた。
こんな状態ね。

webapp2_sample/
  + ext/
    + Paste-1.7.5.1/
    + WebOb-1.2b3/
    + webapp2-2.5.1/

まあ、ふつーに使う人はeasy_installなりpipでインストールすればいいんじゃないかな。

後はコードを書くだけですね。
今回は由緒正しくHello, Worldを書いてみた。

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

import sys
sys.path.append('ext/Paste-1.7.5.1')
sys.path.append('ext/WebOb-1.2b3')
sys.path.append('ext/webapp2-2.5.1')

import webapp2

class HelloWorld(webapp2.RequestHandler):
    def get(self):
        self.response.write(u'こんにちは世界')

applications = webapp2.WSGIApplication([
    ('/', HelloWorld),
    ], debug=True)

def main():
    from paste import httpserver
    httpserver.serve(applications, host='127.0.0.1', port='8080')

if __name__ == '__main__':
    main()

「Hello, world!」じゃなくて「こんにちは世界」じゃないか、というツッコミはなしの方向でお願いできればと。さらに、コトノハサマは? なんて恐ろしすぎですよ…

動かすのは簡単。上のコードをmain.pyで保存してるとします。

$ python main.py

こ・れ・だ・け。
後はブラウザでlocalhostのポート8080を叩いたらちゃんと動いた!
f:id:calnarsa:20120415172616p:image
あ、環境はMacOSX 10.7.3上のpython 2.7.1でございます。

GoogleAppEngineをよく使う人にとっては、GoogleAppEngine以外のところでも同じ感覚でウェブアプリ書けてステキ。
webapp2自体はシンプルなフレームワークなので、いろいろ自分色に染めまくるのもいいかも。
オレオレフレームワークでも作ってみるかい?

EmacsでPythonソースコードのインデントを深くor浅くする技

EmacsのPython-modeの小技。

Pythonはインデントが命。
ある範囲のコードのインデントを一括して深くor浅くしたくなることがよくありますね。
try~exceptで例外処理を入れたくなった時とかね。

そんな時のステキな技。
インデントを一括して深くor浅くしたい範囲を指定して C-c > で深く、 C-c < で浅くなるぜ。
地味だけど、すげー便利。