2011-09-30 5 views
77

あなたは違いが-mスイッチの目的は何ですか?

python -m mymod1 mymod2.py args 

python mymod1.py mymod2.py args 

を呼び出す間にある両方のケースでmymod1.pyがだから何であると呼ばれ、sys.argv

['mymod1.py', 'mymod2.py', 'args'] 

です思える私に説明してもらえ-mのスイッチ?

+0

私が間違っていると私を修正してください。しかし、 '-m'はデフォルトのライブラリパスで' mymod1'を検索しているようです。例: 'python -m SimpleHTTPServer'は動作しますが、' python SimpleHTTPServer'は 'SimpleHTTPServer 'ファイルを開くことができません:[Errno 2]そのようなファイルやディレクトリはありません。 – Basj

+1

私は実際にここの答えをより明確にしました:https://stackoverflow.com/questions/46319694/what-does-it-mean-to-run-library-module-as-a-script-with-the-m-option – Casebash

答えて

74

PEP 338Rationaleセクションの最初の行は言う:

のPython 2.4のモジュールをスクリプトとして実行するためのPythonモジュールの名前空間を使用して配置することができるようにするコマンドラインスイッチの-mを追加します。動機付けの例はpdbやprofileのような標準ライブラリモジュールであり、Python 2.4の実装はこの限られた目的のためにうまくいきます。

このように、現在のディレクトリにあるファイルだけでなく、Pythonの検索パスに任意のモジュールを指定できます。 python mymod1.py mymod2.py argsはまったく同じ効果があります。

Python 2.4では、-mを使用して配置されたモジュールは、ファイル名がコマンドラインで指定されているかのように実行されます。

-mさらに、パッケージの一部であるモジュールなどの作業も同様です。それはPEP 338の残りの部分です。詳しくは、こちらをご覧ください。

+31

'-m'の私の好きな使い方は' python -m SimpleHTTPServer'です。 USBフラッシュドライブを使わずにファイルを共有する必要があるときに便利です。 – arifwn

+6

@arifwn Python3を実行するには、 'python -m http.server'として少し更新する必要がありますが、これはまだ素晴らしいです! –

+7

TL; DR:1) 'python -m package.subpackage.module'を実行すると、通常の解決機構が使用されます。正確な' .py'ファイルを指摘する必要はありません。 2)パッケージは途中でロードされるので、回避策なしで、実行されているモジュールから相対的なインポートを行うことができます。 3)絶対インポートは '.py'ファイルがあるディレクトリではなく、現在のディレクトリに基づいて行われます(' '' ''/path/to/my'ではなく 'sys.path'の先頭にあります)スクリプトが '/ path/to/my/script.py'にある場合)。 – clacke

関連する問題