一部で最強と呼ばれている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);
こちらも, デバッグ用環境などで便利でしょう.