LoginSignup
77
80

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-05-27

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"
    ]
}

jqjsonlint はインストールしないと使えないが、 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 にアクセスすると、ファイル一覧が見える。

SimpleHTTPServer.png

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にメールを送信する。
FromToBody の順にプロンプトが出るので、標準入力からメールを書く。

$ 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を解釈しないなど、とても w3mlynx の代わりにはならない。
強いて使い道を考えるなら、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

turtle.png

encodings.rot_13

標準入力をrot13で暗号化して標準出力に表示する。

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

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

antigravity

$ python -m antigravity

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

77
80
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
77
80