Pythonモジュールをコマンドラインから起動する
$ 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データを受け取り、整形して表示する。
$ echo '{"spam": ["ham", "egg"]}' | python -m json.tool
{
"spam": [
"ham",
"egg"
]
}
jq
や jsonlint
はインストールしないと使えないが、 python
なら多くの環境で使える。
インデントが4固定なのが弱点(他は大抵2)なので、 sed -e 's/ / /g'
にパイプすると吉。
SimpleHTTPServer
カレントディレクトリ以下をHTTPで公開する。
$ python -m SimpleHTTPServer 8080
Serving HTTP on 0.0.0.0 port 8080 ...
この状態で http://localhost:8080 にアクセスすると、ファイル一覧が見える。
Webアプリのデバッグや、HTMLファイルの確認に使える。
引数なしだと8000番ポートがデフォルトで使われる。
CGIHTTPServer
SimpleHTTPServer
とほぼ同じだが、CGIを有効にする。
$ python -m CGIHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
LAN内でちょっとしたCGIスクリプトを公開するのにとても便利。
smtpd
ローカルにSMTPプロキシサーバを立てる。
後述の smtplib
と組み合わせて使える。
$ sudo python -m smtpd -d -n localhost:25
smtplib
localhostにメールを送信する。
From
、 To
、 Body
の順にプロンプトが出るので、標準入力からメールを書く。
$ python -m smtplib
ftplib
ftpクライアントになる。
$ python -m ftplib ftp://localhost
ftp
コマンドの劣化コピーだが、 ftp
がなくて python
がある環境というのは有り得そう。
telnetlib
telnetクライアントになる。
$ python -m telnetlib towel.blinkenlights.nl
有名なスターウォーズ エピソード4のAA版が視聴できる。
poplib
pop3メールクライアントになる。
$ python -m poplib localhost user password
htmllib
テキストブラウザになる。
URLを直接参照できないので、あらかじめローカルにダウンロードしておく必要がある。
$ python -m htmllib index.html
インラインjavascriptを解釈しないなど、とても w3m
や lynx
の代わりにはならない。
強いて使い道を考えるなら、well-formattedでないHTMLを htmllib
で解析するか、 BeautifulSoup
を持ち出すかの分水嶺にはなる(このコマンドが失敗する場合は、Python標準では解析できないHTMLなので、 BeautifulSoup
を使って解析するべきという判定ができる)。
xmllib
XMLの解析をする。
$ python -m xmllib egg.xml
xml: encoding = ISO-8859-1 standalone = None
data: '\n'
...
単体では使いドコロがなさそう… awk
と組み合わせれば多少使えるかもしれない。
が、それをするくらいならスクリプトを書いた方が捗る。
filecmp
2つのディレクトリの差分をとる。
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圧縮/展開ツール。
$ python -m gzip baz.tar # compress
$ python -m gzip -d baz.tar.gz # decompress
後述の zipfile
と比べると、やや低機能。ヘルプすらない。
tar
の展開もできないので、使うことはないかもしれない。
zipfile
ZIP圧縮/展開ツール。
$ python -m zipfile -c foo.zip bar.txt baz.png
-l
オプションでリスト、 -t
オプションでテスト、 -e
オプションで展開、 -c
オプションで圧縮になる。
zip
コマンドでする大抵の操作はできるが、使う機会があるかは微妙(このモジュールが使える環境では、 zip
コマンドも使える可能性が高い)。
mimetype
ファイル名を引数にとり、そのファイルの MIMETYPE を返す。
$ python -m mimetype ham.png
type: image/png encoding: None
ファイル名から判定するので、ファイル自体が実在しなくても動く。
file
コマンドの --mimetype
オプションとほぼ等価か。
base64
標準入力をbase64エンコード/デコードして標準出力に表示する。
$ echo 'python' | python -m base64
cHl0aG9uCg==
$ echo 'cHl0aG9uCg==' | python -m base64 -d
python
ほぼ openssl base64
コマンドと同等。
openssl
がなくて python
がある環境は、そこそこありそう。
uu
標準入力をuuencodeでエンコード/デコードして標準出力に表示する。
$ python -m uu < baz.png
base64と比べると使う機会は少ない。
mimify
標準入力を電子メールで扱える形式にエンコード/デコードし、標準出力に表示する。
base64と似ているが、メールヘッダがつくのが特徴。
$ python -m mimify -e foo.jpg # encode
$ python -m mimify -d bar.eml # decode
制御文字にターミナルを壊されることがあるので、ファイルにリダイレクトするのを推奨。
quopri
標準入力をQuoted-printableでエンコード/デコードして標準出力に表示する。
$ python -m quopri < quux.png
こういったbinary <=> ascii 変換コーデックはbase64がデ・ファクト・スタンダードになっていて、やはり使う機会は少ない。
timeit
Pythonコード片の実行時間を計測する。POSIXの time
コマンドより精密らしい。
誤差が少なくなるように自動でループ回数を決定してくれるなど、かなり賢い。
$ python -m timeit 'pow(2, 10000)'
10000 loops, best of 3: 25 usec per loop
オプションがたくさんある。
詳しくは python -m timeit -h
を参照。
profile
Pythonスクリプトのプロファイルを計測する。
$ 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 しているモジュールを再帰的に探す。
$ python -m modulefinder foo.py
Name File
---- ----
m __main__ foo.py
m array
m re /usr/lib/python2.7/re.py
依存関係でハマった時に使え…ないか。
unittest
Pythonの標準テストライブラリ unittest
のテストランナー。
リファレンスに詳しく書いてあるので、解説は割愛。
python -m unittest discover -v
のイディオムを覚えておくと吉。
doctest
これもPythonの標準テストライブラリ doctest
のテストランナー。
リファレンス参照。
やはり python -m doctest -v foo.py
だけ覚えておけばOK。
個人的には、すごくPythonらしいモジュールだと思う。
site
モジュールの読み込み先、 sys.path
などの情報を表示する。
$ python -m site
sys.path = [
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-x86_64-linux-gnu',
...
Pythonに関係する環境変数は一覧できるので、使い道はありそう。
platform
OSの情報を表示する。
$ 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スタイルの文法を使ってトークンを切り出す。
$ echo 'spam ham egg' | python -m shlex
Token: 'spam'
Token: 'ham'
Token: 'egg'
用途は不明だが、同様のコマンドはなさそう。
locale
ロケールの設定を表示する。
$ 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
コマンドラインからブラウザを開くだけのモジュール。
$ python -m webbrowser -n http://qiita.com
-n
オプションでウィンドウ、 -t
オプションでタブを新規に開く。
地味だが同様のコマンドは少ないので、使いドコロがあれば役立つかも。
開くブラウザは、システムで規定になっているものが自動的に選ばれ、変更はできない。
tabnanny
Pythonスクリプトのインデントをチェックし、曖昧さがある場合は修正して書き換える。
$ python -m tabnanny my_script.py
ディレクトリも引数にとれるが、中のファイルを再帰的に上書きしてしまうので注意。
compileall
Pythonスクリプトをコンパイルする。
python -m compileall my_project/
ディレクトリを再帰的に探索して、 .py
ファイルを .pyc
にコンパイルする。
デコンパイラがあるので難読化には使えないし、
通常はパフォーマンスの向上も大してないので、あまり使う機会がない。
リファレンスはこちら。
dis
Pythonの逆アセンブラ。 *.py
スクリプト内のコードを解析する。
$ 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',))
命令の一覧はリファレンス参照。
おまけ
code
インタプリタを開く。 引数なしの python
コマンドと等価。
$ 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の関数呼び出しをトレースする。
リファレンスに使い方が載っているが、正直 pdb
で充分な気がする。
pdb
Pythonの対話型デバッガ pdb
を起動する。
詳細はリファレンス参照。
普通は pdb
コマンドとして提供されているので、わざわざモジュールとして呼び出す必要はない。
pydoc
これもおなじみ pydoc
コマンドになっているが、一応モジュールとしても起動できる。
turtle
標準のGUIモジュール Tkinter
のデモ。
標準添付とはいえ、 OSXなど環境によっては入っていないので注意。
$ python -m turtle
encodings.rot_13
標準入力をrot13で暗号化して標準出力に表示する。
$ echo 'hamegg' | python -m encodings.rot_13
unzrtt
元はネタモジュール。使いドコロは普通ないが、rot13が標準ライブラリに同梱されているというのは面白い。
antigravity
$ python -m antigravity
ネタモジュールその2。解説はしない。