知っておくと使えるときもある、Python の -m オプション
すっかり「あるとき」が多くなった Python
かつてPython 2系から3系への移行なんていうことがあったのも今は昔…
Pythonもすっかりメジャーなスクリプト言語として定着しましたね。
そういった背景もあり、今やPythonがプリインストールされている環境も非常に多いのではないでしょうか。
今回は環境にPythonが入っていればすぐに使える -m
オプションについて紹介します。
mオプションとは
Python の -m
オプションは、Pythonモジュールをスクリプトとして実行するためのコマンドラインオプションです。
このオプションを使うと、インストールされているパッケージやモジュールを直接実行できます。
具体的には、以下のような形式で使用します。
python -m module_name [arguments]
このコマンドは「module_nameというモジュールをメインプログラムとして実行する」という意味になります。
mオプションの便利な使用例
と、いうと、よくわからないかもしれませんが、ポイントとしては、 このオプションを使うとPythonに標準で含まれている便利なモジュールを簡単に利用できる ということです。
いくつかの代表的な例を見てみましょう。
簡易HTTPサーバーを立てられる http.server
まずはみんな大好きなローカルのHTTPサーバの立て方です。
python -m http.server 8080
これだけで、 現在のディレクトリをルートとする簡易HTTPサーバーを立ち上げることができます。
引数にはポート番号をとっていて、これだけでポート8000でHTTPサーバーが起動させられます。
つまり、 http://localhost:8080/
などで現在のディレクトリの内容をブラウザで閲覧できるようになります。
下記は 8821
番のポートでサーバを立ち上げたときの例です。
index.html
などを配置するともちろん静的なHTMLファイルを表示できたりもするので、 ファイル共有やちょっとしたテスト用のウェブサーバー としてとても便利です。
(Claudeに適当に軽いHTMLを作ってくれといったら作ってきたHTMLファイルを表示した例)
JSONのパース等を行う json.tool
これも個人的にはたまに使うやつです。 JSONデータを整形・検証するのに便利なモジュールです。
python -m json.tool input.json > output.json
このコマンドは、input.jsonファイルを読み込んで整形し、output.jsonに保存します。
このように直接jsonファイルを読み込んでいくこともできますが、 主にはpipeで渡す形で使います。
echo '{"company": "ABC", "age": 74}' | python -m json.tool
これで、JSONの構文チェックや読みやすく整形することができます。
{ "company": "ABC", "age": 74 }
特に curl
等で取得したデータをパースするのに便利です。
構文エラーが発生している場合はエラーが出ます(下記は }
が余分についている例)
> echo '{"company": "ABC", "age": 74}}' | python -m json.tool Extra data: line 1 column 30 (char 29)
ただし、日本語などは、 no-ensure-ascii
オプションを指定しておく必要があります。
例えば、以下のように日本語のJSONをパースする場合、
echo '{"company": "朝日放送グループホールディングス", "area": "関西"}' | python -m json.tool
デフォルトでは日本語部分がエスケープされて表示されます。
{ "company": "\u671d\u65e5\u653e\u9001\u30b0\u30eb\u30fc\u30d7\u30db\u30fc\u30eb\u30c7\u30a3\u30f3\u30b0\u30b9", "area": "\u95a2\u897f" }
そこで、Python 3.9以降では、 no-ensure-ascii
オプションを使って日本語をそのまま表示させることができます。
echo '{"company": "朝日放送グループホールディングス", "area": "関西"}' | python -m json.tool --no-ensure-ascii
これにより、下記のように日本語がそのまま表示されます。
{ "company": "朝日放送グループホールディングス", "area": "関西" }
とはいえ、 jq
コマンドを使えばフィルタリングや目的の項目の抽出が出来るので、 jq
コマンドが入っている場合はそちらを使ったほうがいいでしょう。
jq
コマンドが入ってない環境に出くわしたときに、サッと使えるという意味では便利な知識かと思います。
ドキュメント情報を取得する pydoc
モジュールのドキュメントを閲覧するための便利なモジュールです。コマンドラインから特定のモジュールやパッケージの詳細なドキュメントを表示できます。
例えば、 requests
パッケージのドキュメントを見たい場合は以下のように実行します。
python -m pydoc requests
すると、下記のようなレスポンスが得られます。
Help on package requests: NAME requests DESCRIPTION Requests HTTP Library ~~~~~~~~~~~~~~~~~~~~~ Requests is an HTTP library, written in Python, for human beings. Basic GET usage: >>> import requests >>> r = requests.get('https://www.python.org') >>> r.status_code 200 >>> b'Python is a programming language' in r.content True ... or POST: >>> payload = dict(key1='value1', key2='value2') >>> r = requests.post('https://httpbin.org/post', data=payload) >>> print(r.text) { ... "form": { "key1": "value1", "key2": "value2" }, ... } The other HTTP methods are supported - see `requests.api`. Full documentation is at <https://requests.readthedocs.io>.
特に、ドキュメントURLが記載されていることが多い点においては有用かと思います。
その他
あとは少しネタっぽいものですが… いくつか紹介します。
まず、カレンダーを表示する calendar
です。
python -m calendar 2025 8
とすることで、2025年8月のカレンダーが表示されます。
August 2025 Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
引数指定がない場合は年間のカレンダーを出してくれます。 -t html
オプションでHTMLファイルにできたり、始まりの曜日を変更できたりなど、オプションが豊富だったりもします…
上記はとりあえず生成したHTMLファイルを簡易サーバで立ち上げたときの例です。
あとは、 The Zen of Python を表示することもできます。
python -m this
お馴染みの(?)文章が表示されます。
The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. ...
胸に刻み込みたいですね…
まとめ
今回は、Python の -m
オプションについて紹介しました。
今回紹介したように即席でHTTPサーバーを起動したりJSONを整形できたりする他にも、zipやbase64の取り扱いや実行時間計測での性能測定など様々な場面で活用できます。
意外と知らない人も多い印象ですが、知っておいて損のない知識かと思います。