コマンドラインで使えるPython標準モジュール

Pythonモジュールをコマンドラインから起動する
--------------------------------------

```bash
$ python --help
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
...
-m mod : run library module as a script (terminates option list)
...
```

> -m mod : run library module as a script (terminates option list)

`-m` オプションを付けて `python` を起動すると、`$PYTHONPATH` からモジュールを検索して、実行してくれる。
Battery Included を標榜するだけあって、多岐にわたる機能がコードを書かずに使える。
もしPython言語自体に興味がなくても、シェルを操作するうえで覚えておくと役立つ。
が、あまりドキュメント化されていないものも多いようなので、知っているものを紹介する。

使えそうなモジュールの紹介
----------------------

いずれも、(OSX/Linuxなら標準で入っている)python2系で使える。特別なパッケージのインストールも不要。

### json.tool

標準入力からJSONデータを受け取り、整形して表示する。

```bash
$ echo '{"spam": ["ham", "egg"]}' | python -m json.tool
{
    "spam": [
        "ham",
        "egg"
    ]
}
```

`jq` や `jsonlint` はインストールしないと使えないが、 `python` なら多くの環境で使える。

インデントが4固定なのが弱点(他は大抵2)なので、 `sed -e 's/  / /g'` にパイプすると吉。

### SimpleHTTPServer

カレントディレクトリ以下をHTTPで公開する。

```bash
$ python -m SimpleHTTPServer 8080
Serving HTTP on 0.0.0.0 port 8080 ...
```

この状態で http://localhost:8080 にアクセスすると、ファイル一覧が見える。

![SimpleHTTPServer.png](https://qiita-image-store.s3.amazonaws.com/0/73424/04d83cf3-a373-8c5d-5b4a-d047a59bd2fb.png)


Webアプリのデバッグや、HTMLファイルの確認に使える。
引数なしだと8000番ポートがデフォルトで使われる。

### CGIHTTPServer

`SimpleHTTPServer` とほぼ同じだが、CGIを有効にする。

```bash
$ python -m CGIHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
```

LAN内でちょっとしたCGIスクリプトを公開するのにとても便利。

### smtpd

ローカルにSMTPプロキシサーバを立てる。
後述の `smtplib` と組み合わせて使える。

```bash
$ sudo python -m smtpd -d -n localhost:25
```

### smtplib

localhostにメールを送信する。
`From` 、 `To` 、 `Body` の順にプロンプトが出るので、標準入力からメールを書く。

```bash
$ python -m smtplib
```

### ftplib

ftpクライアントになる。

```bash
$ python -m ftplib ftp://localhost
```

`ftp` コマンドの劣化コピーだが、 `ftp` がなくて `python` がある環境というのは有り得そう。

### telnetlib

telnetクライアントになる。

```bash
$ python -m telnetlib towel.blinkenlights.nl
```

有名なスターウォーズ エピソード４のAA版が視聴できる。

### poplib

pop3メールクライアントになる。

```bash
$ python -m poplib localhost user password
```


### htmllib

テキストブラウザになる。
URLを直接参照できないので、あらかじめローカルにダウンロードしておく必要がある。

```bash
$ python -m htmllib index.html
```

インラインjavascriptを解釈しないなど、とても `w3m` や `lynx` の代わりにはならない。
強いて使い道を考えるなら、well-formattedでないHTMLを `htmllib` で解析するか、 `BeautifulSoup` を持ち出すかの分水嶺にはなる(このコマンドが失敗する場合は、Python標準では解析できないHTMLなので、 `BeautifulSoup` を使って解析するべきという判定ができる)。

### xmllib

XMLの解析をする。

```bash
$ python -m xmllib egg.xml
xml: encoding = ISO-8859-1 standalone = None
data: '\n'
...
```

単体では使いドコロがなさそう… `awk` と組み合わせれば多少使えるかもしれない。
が、それをするくらいならスクリプトを書いた方が捗る。

### filecmp

２つのディレクトリの差分をとる。

```bash
python -m filecmp dir1/ dir2/
diff dir1 dir2
Only in dir1 : ['foo.txt']
Only in dir2 : ['bar.txt']
Differing files : ['baz.txt']
```

`-r` オプションで再帰的にディレクトリを辿る(デフォルトは1階層のみ)。
ファイル名と変更の有無はわかるが、内容までは表示しないので注意。

### gzip

GZIP圧縮/展開ツール。

```bash
$ python -m gzip baz.tar   # compress
$ python -m gzip -d baz.tar.gz # decompress
```

後述の `zipfile` と比べると、やや低機能。ヘルプすらない。
`tar` の展開もできないので、使うことはないかもしれない。

### zipfile

ZIP圧縮/展開ツール。

```bash
$ python -m zipfile -c foo.zip bar.txt baz.png
```

`-l` オプションでリスト、 `-t` オプションでテスト、 `-e` オプションで展開、 `-c` オプションで圧縮になる。

`zip` コマンドでする大抵の操作はできるが、使う機会があるかは微妙(このモジュールが使える環境では、 `zip` コマンドも使える可能性が高い)。

### mimetype

ファイル名を引数にとり、そのファイルの MIMETYPE を返す。

```bash
$ python -m mimetype ham.png
type: image/png encoding: None
```

ファイル名から判定するので、ファイル自体が実在しなくても動く。
`file` コマンドの `--mimetype` オプションとほぼ等価か。

### base64

標準入力をbase64エンコード/デコードして標準出力に表示する。

```bash
$ echo 'python' | python -m base64
cHl0aG9uCg==
$ echo 'cHl0aG9uCg==' | python -m base64 -d
python
```

ほぼ `openssl base64` コマンドと同等。
`openssl` がなくて `python` がある環境は、そこそこありそう。

### uu

標準入力をuuencodeでエンコード/デコードして標準出力に表示する。

```bash
$ python -m uu < baz.png
```

base64と比べると使う機会は少ない。

### mimify

標準入力を電子メールで扱える形式にエンコード/デコードし、標準出力に表示する。
base64と似ているが、メールヘッダがつくのが特徴。

```bash
$ python -m mimify -e foo.jpg  # encode
$ python -m mimify -d bar.eml  # decode
```

制御文字にターミナルを壊されることがあるので、ファイルにリダイレクトするのを推奨。

### quopri

標準入力を[Quoted-printable](http://ja.wikipedia.org/wiki/Quoted-printable)でエンコード/デコードして標準出力に表示する。

```bash
$ python -m quopri < quux.png
```

こういったbinary <=> ascii 変換コーデックはbase64がデ・ファクト・スタンダードになっていて、やはり使う機会は少ない。

### timeit

Pythonコード片の実行時間を計測する。POSIXの `time` コマンドより精密らしい。
誤差が少なくなるように自動でループ回数を決定してくれるなど、かなり賢い。

```bash
$ python -m timeit 'pow(2, 10000)'
10000 loops, best of 3: 25 usec per loop
```

オプションがたくさんある。
詳しくは `python -m timeit -h` を参照。

### profile

Pythonスクリプトのプロファイルを計測する。

```bash
$ python -m profile ham.py
          473 function calls in 0.009 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 :0(range)
        1    0.006    0.006    0.006    0.006 :0(setprofile)
...
```

スクリプトのチューニングをするときに、ボトルネックを探すのに良い。

### modulefinder

import しているモジュールを再帰的に探す。

```bash
$ python -m modulefinder foo.py

  Name          File
  ----          ----
m __main__      foo.py
m array
m re            /usr/lib/python2.7/re.py
```

依存関係でハマった時に使え…ないか。

### unittest

Pythonの標準テストライブラリ `unittest` のテストランナー。
[リファレンス](http://docs.python.jp/2/library/unittest.html#unittest-command-line-interface)に詳しく書いてあるので、解説は割愛。

`python -m unittest discover -v` のイディオムを覚えておくと吉。

### doctest

これもPythonの標準テストライブラリ `doctest` のテストランナー。
[リファレンス](http://docs.python.jp/2/library/doctest.html#docstring)参照。

やはり `python -m doctest -v foo.py` だけ覚えておけばOK。

個人的には、すごくPythonらしいモジュールだと思う。

### site

モジュールの読み込み先、 `sys.path` などの情報を表示する。

```bash
$ python -m site
sys.path = [
    '/usr/lib/python2.7',
    '/usr/lib/python2.7/plat-x86_64-linux-gnu',
...
```

Pythonに関係する環境変数は一覧できるので、使い道はありそう。

### platform

OSの情報を表示する。

```bash
$ python -m platform
Linux-3.13.0-48-generic-x86_64-with-Ubuntu-14.04-trusty
```

出力される情報は `uname -a` と (Linuxの場合は) `cat /etc/issue` を足したような感じで、
ハイフン区切りで正規化されていて使いやすい。

### shlex

シェルの字句解析器になる。
Bourne shellスタイルの文法を使ってトークンを切り出す。

```bash
$ echo 'spam ham egg' | python -m shlex
Token: 'spam'
Token: 'ham'
Token: 'egg'
```

用途は不明だが、同様のコマンドはなさそう。

### locale

ロケールの設定を表示する。

```bash
$ python -m locale
Locale aliasing:

Locale defaults as determined by getdefaultlocale()
-----------------------------------------------------------------
Language: ja_JP
Encoding: UTF-8

Locale settings on startup:
-----------------------------------------------------------------
LC_NUMERIC ...
   Language:  (undefined)
   Encoding:  (undefined)
...
```

`locale` コマンドとほぼ同等、読みやすい(冗長な)表示になる。

### webbrowser

コマンドラインからブラウザを開くだけのモジュール。

```bash
$ python -m webbrowser -n http://qiita.com
```

`-n` オプションでウィンドウ、 `-t` オプションでタブを新規に開く。
地味だが同様のコマンドは少ないので、使いドコロがあれば役立つかも。
開くブラウザは、システムで規定になっているものが自動的に選ばれ、変更はできない。

### tabnanny

Pythonスクリプトのインデントをチェックし、曖昧さがある場合は修正して書き換える。

```bash
$ python -m tabnanny my_script.py
```

ディレクトリも引数にとれるが、中のファイルを再帰的に上書きしてしまうので注意。

### compileall

Pythonスクリプトをコンパイルする。

```bash
python -m compileall my_project/
```

ディレクトリを再帰的に探索して、 `.py` ファイルを `.pyc` にコンパイルする。
デコンパイラがあるので難読化には使えないし、
通常はパフォーマンスの向上も大してないので、あまり使う機会がない。
[リファレンス](http://docs.python.jp/2/library/compileall.html)はこちら。

### dis

Pythonの逆アセンブラ。 `*.py` スクリプト内のコードを解析する。

```bash
$ python -m dis /usr/lib/python2.7/abc.py
  4           0 LOAD_CONST               0 ('Abstract Base Classes (ABCs) according to PEP 3119.')
              3 STORE_NAME               0 (__doc__)

  6           6 LOAD_CONST               1 (-1)
              9 LOAD_CONST               2 (None)
             12 IMPORT_NAME              1 (types)
             15 STORE_NAME               1 (types)

  8          18 LOAD_CONST               1 (-1)
             21 LOAD_CONST               3 (('WeakSet',))
```

命令の一覧は[リファレンス](http://docs.python.jp/2/library/dis.html)参照。

おまけ
=====

### code

インタプリタを開く。 引数なしの `python` コマンドと等価。

```bash
$ python -m code
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
```

### trace

Pythonの関数呼び出しをトレースする。

[リファレンス](http://docs.python.jp/2/library/trace.html)に使い方が載っているが、正直 `pdb` で充分な気がする。

### pdb

Pythonの対話型デバッガ `pdb` を起動する。
詳細は[リファレンス](http://docs.python.jp/2/library/pdb.html)参照。

普通は `pdb` コマンドとして提供されているので、わざわざモジュールとして呼び出す必要はない。

### pydoc

これもおなじみ `pydoc` コマンドになっているが、一応モジュールとしても起動できる。

### turtle

標準のGUIモジュール `Tkinter` のデモ。
標準添付とはいえ、 OSXなど環境によっては入っていないので注意。

```bash
$ python -m turtle
```

![turtle.png](https://qiita-image-store.s3.amazonaws.com/0/73424/7d288887-c25f-d1f1-dc3e-18a8949ddfbc.png)


### encodings.rot_13

標準入力を[rot13](http://en.wikipedia.org/wiki/ROT13)で暗号化して標準出力に表示する。

```bash
$ echo 'hamegg' | python -m encodings.rot_13
unzrtt
```

元はネタモジュール。使いドコロは普通ないが、rot13が標準ライブラリに同梱されているというのは面白い。

### antigravity

```bash
$ python -m antigravity
```

ネタモジュールその２。解説はしない。