Pythonをコマンドラインから使用する際、様々なオプションがあります。本記事では、その中の一つである、-mオプションを説明します。
-mオプションとは
「-m」オプションは「module」の略で、Pythonモジュールを実行するためのオプションです。基本的な構文は次のとおりです。
python -m モジュール名 [引数]
これは、指定したモジュールを「スクリプトとして実行する」という意味です。つまり、そのモジュールの main 部分が実行されます。
mオプションのメリット
パスの問題を回避できる
モジュールをインポートする際、Pythonはシステムのパス設定(sys.path)を使用してモジュールを検索します。-mオプションを使用すると、このパス検索の仕組みを利用して正しいモジュールを見つけることができます。
これは特に同名のスクリプトが複数存在する環境や、複雑なパス設定がある場合に有用です。例えば、カレントディレクトリにpip.pyというファイルがある場合、単にpip installを実行するとローカルのpip.pyが実行されてしまいますが、python -m pip installとすれば正しいpipモジュールが使用されます。
# 悪い例:現在のディレクトリに同名のファイルがあると問題が発生する可能性
pip install numpy # カレントディレクトリにpip.pyがあるとこれは失敗する可能性がある
# 良い例:パスの問題を回避して確実に正しいモジュールを使用
python -m pip install numpy # 常にシステムのpipモジュールを使用
# 別の例:単体テスト実行
# test.pyというファイルがあるディレクトリで
python -m unittest test # 正しくunittestモジュールを通して実行される
# さらに具体的な例
# 以下のような構造のプロジェクト
# myproject/
# └── mypackage/
# ├── __init__.py
# └── module.py
# module.pyの内容
def example_function():
print("This is an example function")
# 実行方法
python -m mypackage.module # パッケージとして正しく実行される
パッケージ内のモジュールを実行できる
パッケージ内の特定のモジュールを実行したい場合、-mオプションが便利です。
python -m package.subpackage.module
これにより、パッケージの構造に関係なく、特定のモジュールを直接実行できます。
Pythonの標準ライブラリの機能を簡単に利用できる
Pythonには様々な便利な標準ライブラリが含まれていますが、そのいくつかは-mオプションを通じて直接実行できるようになっています。
# doctest(ドキュメントのテストを実行)
python -m doctest file.py
# unittest(ユニットテストを実行)
python -m unittest discover
# timeit(コードのパフォーマンスを測定)
python -m timeit "'-'.join(str(n) for n in range(100))"
-mオプションの仕組み
-mオプションが実行される際、Pythonは次のような処理を行います。
- 指定されたモジュール名をsys.pathから検索
- モジュールを見つけたら、それを__main__モジュールとして扱う
- モジュール内のコードを実行
これにより、モジュールが通常のPythonスクリプトのように実行されます。
-mオプションの使用例
venv – 仮想環境の作成
python -m venv myenv
venvモジュールを使って仮想環境を作成する例です。プロジェクトごとに独立した環境を作成でき、ライブラリのバージョン衝突を防げます。
直接インストールするのではなく、-mオプションで実行することで、複数のPythonバージョンがインストールされている場合でも、コマンドを実行しているPythonインタープリタに関連付けられた正しいvenvモジュールを使用します。
pip – パッケージの管理
python -m pip install requests
pipモジュールを使ってパッケージをインストールします。
unittest – テストの実行
python -m unittest discover tests
unittestモジュールを使ってテストを実行します。testsディレクトリ内のすべてのテストファイルを自動的に見つけて実行してくれます。
-mオプションを使うことで、testsディレクトリ内のすべてのテストファイルを自動的に検出し実行します。これにより、プロジェクト内のすべてのテストケースを一度に実行できます。
注意点
-mと直接実行の違い
# モジュールとして実行
python -m mymodule
# スクリプトとして直接実行
python mymodule.py
この2つには微妙な違いがあります。モジュールとして実行する場合、Pythonはモジュール検索パスを使用してモジュールを見つけようとします。一方、スクリプトとして実行する場合は、指定されたファイルパスを直接実行します。
また、-mオプションを使用すると、そのモジュールの__name__変数は”main“になりますが、インポートされたモジュールの__name__はモジュール名になります。
まとめ
Pythonの-mオプションは、モジュールをスクリプトとして実行するためのオプションです。特に以下のような場面で役立ちます。
- パッケージ内のモジュールを実行したい場合
- パスの問題を回避したい場合
- 標準ライブラリの機能を直接利用したい場合