読者です 読者をやめる 読者になる 読者になる

「結構便利だからみんな使った方がいいぞ!」という7つのPythonライブラリ

python

一部で最強と呼ばれているPythonには, virtualenvやipythonのような絶対入れる超定番以外にも, あると便利なライブラリというものがあります.

ここではラッキーセブン, 7つご紹介しましょう. なお, furl以外は3.xに対応しています.

requests
覚えやすいWebリクエスト(urllib.request.urlopenの代替)
furl
URLの扱いをもっとシンプルに(urllib.parse.urlparseの代替)
PyQuery
jQueryスクレイピング力をPythonに(html.parser.HTTPParser, lxml, BeautifulSoupの代替)
Send2Trash/Send2Trash3k
クロスプラットフォームな「ごみ箱へ送る」
Windows向けPythonランチャー
2.xと3.xを切り替える
PySide/PyQt4
クールなGUIライブラリ(TkInterの代替)
PyExecJS
どんな環境でもPythonからJavaScriptを実行

requests 覚えやすいWebリクエスト(urllib.request.urlopenの代替)

すでに良い紹介記事があるのでこちらの記事を御覧ください.

WEBから情報をGET/POSTするときは, urllib.request.urlopenを使いますが, requestsはyよりPythonicに, これ以上シンプルにしようがないくらいシンプルにやってくれます.

>>> r = requests.get('https://api.github.com', auth=('user', 'pass'))
>>> r.status_code
204
>>> r.headers['content-type']
'application/json'
>>> r.content

furl URLの扱いをもっとシンプルに(urllib.parse.urlparseの代替)

URLから, クエリ引数を抜き出したいときどうすればいいでしょうか? 標準ライブラリにはURL文字列をタプルに変換するurllib.parse.urlparseがありますが, furlならもっとシンプルに行けます.

以下はREADMEに載っている例です.

>>> from furl import furl
>>> f = furl('http://www.google.com/?one=1&two=2')
>>> f.args['three'] = '3'
>>> del f.args['one']
>>> f.url
'http://www.google.com/?three=3&two=2'

一度URLを渡せば, クエリ引数やドメインなどに属性でアクセス出来るようになります. また, 変更も容易です.

>>> furl('http://www.google.com/?one=1').add({'two':'2'}).url
'http://www.google.com/?two=2&one=1'
>>> furl('http://www.google.com/?one=1&two=2').set({'three':'3'}).url
'http://www.google.com/?three=3'
>>> furl('http://www.google.com/?one=1&two=2').remove(['one']).url
'http://www.google.com/?two=2'

PyQuery jQueryスクレイピング力をPythonに(html.parser.HTTPParser, lxml, BeautifulSoupの代替)

HTMLをスクレイピングするライブラリとしては, 標準ライブラリのhtml.parser.HTTPParserや, サードパーティのlxmlやBeautifulSoupがすでにあります. html.parser.HTTPParserやlxmlは低レベル過ぎて面倒です. 比較的手軽なBeautifulSoupもメソッド名などを新たに覚える必要があります.

その点, PyQueryはjQueryと同じように扱えるので, 強力かつ, 敷居がものすごく低いと言っていいでしょう.

以下はREADMEに載っている例です.

まず, PyQueryクラスでHTMLを開きます. 文字列から構築, WEB, ローカルファイルどれでも開けます.

>>> from pyquery import PyQuery as pq
>>> from lxml import etree
>>> import urllib
>>> d = pq("")
>>> d = pq(etree.fromstring(""))
>>> d = pq(url='http://google.com/')
>>> # d = pq(url='http://google.com/', opener=lambda url: urllib.urlopen(url).read())
>>> d = pq(filename=path_to_html_file)

すると, dはjQueryの $ のように扱えるようになります.

>>> d("#hello")
[]
>>> p = d("#hello")
>>> print(p.html())
Hello world !
>>> p.html("you know Python rocks")
[]
>>> print(p.html())
you know Python rocks
>>> print(p.text())
you know Python rocks

なお, PyQueryは内部でlxmlを使っているのですが, lxmlはPure Pythonではありません.そのため, 最新のlxmlをインストールするときはVisual C++GCCのようなコンパイラと,libxml2・libxsltのようなライブラリが必要です.
バージョンは古くてもよい場合(PyQueryを使うだけなら古くても良い)はhttp://pypi.python.org/pypi/lxml/2.3にコンパイル済みEGGがあります.

Send2Trash/Send2Trash3k クロスプラットフォームな「ごみ箱へ送る」

send2trashが提供している関数はただひとつsend2trashです。
その名の通り、ファイルをゴミ箱へ送ります。WindowsとMacOSXで動作します。
いつでも役立つものではないかもしれません。でもいつかは役立ちます。

>>> from send2trash import send2trash
>>> open("spam.txt", "w").close() # spam.txtという名前のファイルを作成
>>> send2trash("spam.txt") #ゴミ箱へ送る
>>> send2trash("missing.txt") #存在しないファイルだとOSErrorが発生
Traceback (most recent call last):
  File "", line 1, in 
  File "C:\Python32\lib\site-packages\send2trash\plat_win.py", line 54, in send2
trash
    raise OSError(msg)
OSError: Couldn't perform operation. Error code: 1026

WindowsでもMacOSXでも, コマンドラインからゴミ箱へ送るコマンドは無かったと思うので,
こんなスクリプトを作っておくと便利です。

#!python3
#encoding:utf-8
#trash.py
import sys
import os.path
import send2trash
from glob import iglob

for a in sys.argv[1:]:
    for f in map(os.path.abspath, iglob(a)):
        print(f)
        send2trash.send2trash(f)

なお, Send2TrashはPython2.x専用で, Python3.x用はSend2Trash3kという名前になっています.

$ easy_install-3.2 Send2Trash3k
$ pip install-3.2 Send2Trash3k

Windows向けPythonランチャー

こちらはWindows限定. なんだかんだで, 複数のバージョンを使い分けるのは, 蛇使いの宿命です. 普段は3.2を, ライブラリの関係で時には2.7を, App Engineでは2.5を, と使い分けます.

これが*nixならバージョンごとに, python-3.2, python-2.7, python-2.5とコマンドがそれぞれインストールされるし, ファイル先頭のシバンでどのバージョン用のスクリプトか区別できるのですが, Windowsにはありません.

そこで, Mark Hammond氏(pywin32の作者)が, Windows用にPythonのバージョンを切り返るpy コマンドを開発しました. 3.3からは標準で入るらしいです.

こんな風に使います.

$ py script.py 

で, script.pyの最初の行に,

#!/usr/bin/env python2

というコメントがあるとpython 2.xを,

#!/usr/bin/env python3

があると, python 3.xを使って実行してくれます.


明示的にバージョンを指定することも出来ます.

$ py -2 
# python 2.x を実行
$ py -3
# python 3.x を実行

関連付けの設定も, C:\Python32\Python.exeではなく, このpyコマンドの方にしておいた方がいいでしょう.

PySide/PyQt4 クールなGUIライブラリ(TkInterの代替)

TkInterを本格的なプロジェクトで使う人はそんなに多くないと思いますが,
小さなツール程度でも, PySide/PyQt4はTkInterと同等以上にうまくやれます.

公式ドキュメントの最初の例はこれです.

#!/usr/bin/python
 
# Import PySide classes
import sys
from PySide.QtCore import *
from PySide.QtGui import *
 
 
# Create a Qt application
app = QApplication(sys.argv)
# Create a Label and show it
label = QLabel("Hello World")
label.show()
# Enter Qt application main loop
app.exec_()
sys.exit()

これだけじゃ, 何も凄さが伝わりませんね(^-^).
PySide/PyQt4は大規模なのでここでは説明しきれません. ドキュメントを読んだり, 実際に使ってみたりしてください.

ただし, TkInterと比べた時の優位性として, ウィンドウ設計用のIDEがQtに付属しています. また, ウィジェットも圧倒的に豊富です. そして, TkInterの古臭い外観と違って, QtはちゃんとOSの最新のテーマで表示してくれます.

なおPySideとPyQt4の違いですが, 機能はほとんど同じです.
ただし, ライセンスがPySideはLGPL, PyQt4はGPLです. また, PySideはPyPIに登録されているので,

$ easy_install PySide

とすることができます.

PyExecJS どんな環境でもPythonからJavaScriptを実行

PythonからJavaScriptのライブラリを呼ぶ, 例えばCoffeeScriptをコンパイルしたい場合などは, PyV8などのバインディングが使えます. しかし, PyV8がデフォルトでインストールされているとは限りません.

そんな時, WindowsならJScript, MacOSXならJavaScriptCore, あるいはNode.jsやSpiderMonkeyを使ってJavaScriptを実行してくれるのが, RubyのExecJSの移植版, PyExecJSです.
以下はPyPIに載っているサンプルです.

>>> import execjs
>>> execjs.eval("'red yellow blue'.split(' ')")
['red', 'yellow', 'blue']
>>> ctx = execjs.compile("""
...     function add(x, y) {
...         return x + y;
...     }
... """)
>>> ctx.call("add", 1, 2)
3

PyExecJSは, PyV8がインストールされていればPyV8を, 無ければOSのJavaScriptエンジンを, と自動で実行方法を切り替えてくれます. もちろん, 明示的に指定することも出来ます.

>>> default = execjs.get() # the automatically picked runtime
>>> default.eval("1 + 2")
3
>>> jscript = execjs.get("JScript")
>>> jscript.eval("1 + 2")
3
>>> node = execjs.get("Node")
>>> node.eval("1 + 2")
3

JScriptなどを使う場合はファイルに一旦コードを書きこんでやり取りをするので, 実行速度は遅くなります. しかし, PyV8はインストールするのは, コンパイルにboost C++ ライブラリが必要になるなど, 割りとヘビーな作業です. そんな時は, PyExecJSが役立つでしょう.


すいません, 便利なライブラリが7つも思い浮かびませんでした. 最後のPyExecJSは手前味噌です. 手前味噌ついでに, PythonからCoffeeScriptをコンパイルするCoffeeScriptも, Ruby版を移植して作っています.

>>> import coffeescript
>>> coffeescript.compile('add = (a, b) -> a + b')
'(function() {\n  var add;\n\n  add = function(a, b) {\n    return a + b;\n  };\
n\n}).call(this);\n'
>>> print(coffeescript.compile('add = (a, b) -> a + b'))
(function() {
  var add;

  add = function(a, b) {
    return a + b;
  };

}).call(this);

こちらも, デバッグ用環境などで便利でしょう.