2017-09-20 7 views
2

私は、Pythonに新たなんだ(とプログラミングにも)と、十分に文書が、私は正確に正確に仮想環境の作成時に-mディレクティブ(意味を理解することはできません:。python3 -m venv my_env"-m"オプションを使用して "スクリプトとしてライブラリモジュールを実行する"とはどういう意味ですか?

を限り私はドキュメントから読むことができます。これは "ライブラリモジュールをスクリプトとして実行する"の略です。実際にはわかりませんが、コマンドを実行する際の違いは何ですか?

さらに、これはPython 3の特徴ですか?

+0

ドキュメントは、あなたの友人です:https://docs.python.org/3.5/using/cmdlinehtml#cmdoption-m – freakish

+0

あなたは[documentation](https://docs.python.org/using/cmdline.html#cmdoption-m)を読んだことがありますか?あなたはそれが十分に文書化されているが、 "ドキュメンテーション"にはリンクしていないと言ったので、尋ねるだけです。 – MSeifert

答えて

8

Pythonモジュールは、Pythonが見つけることができる場所にある単なるスクリプトファイルです。すべてのスクリプトと同じように、スクリプトがどこにあるかわかっている場合は、スクリプトを直接実行できます。 python /path/to/module.py

正しく設計されたモジュールは、通常、設定したもの(たとえば、インポートできる関数やタイプ)以外は何もしませんが、通常は目に見える副作用がありません。だからあなたはimport sysをやることができ、何も起こりません。

しかし、モジュールによっては、コマンドラインから実行すると便利なものがあります。その例にはvenvが含まれていますが、http.serverまたはidlelibもあります。これらはすべて、通常のモジュールであり、副作用なしに他のモジュールからインポートできます。

しかし、直接実行するとき、彼らはすべてのことを行う(仮想環境を設定しますvenv例えばを、http.serverは、単純なHTTPサーバーを実行し、idlelib空転)。これは通常、次のチェックで行われます。

if __name__ == '__main__': 
    print('Module is being executed directly, so do stuff here') 

これは、スクリプト/モジュールの認識の特別な方法で直接実行されている、またはそれだけでいくつかの他のモジュールからインポートされていますか。質問“What does if __name__ == '__main__': do?”について詳しく知ることができます。

これまでに設定したように、python /path/to/module.pyを使用してモジュールを直接実行することができます。しかし、これはあなたがモジュールへの完全なパスを知る必要があります。そのため、-mオプションが有効になります。通常はimport modulenameを使用してインポートできるモジュールの場合は、python -m modulenameを使用してそのモジュールを直接実行できます。ちょうどあなたが完全なパスを入力したかのように。

上記の例では、python -m venv,python -m http.serverを使用できます。またはpython -m idlelib

1

これはpython3のプロパティではありません。モジュール式の場合は-mを使用する必要がありますスクリプト。あなたはhellomodule.pyを実行する必要がモジュール手段としてあなたは、任意のクラスや関数やhellomodule.pyにfirst_script.pyの任意のオブジェクトを使用している場合、あなたは今、この

|-HelloModule 
    |_ __init__.py 
    |_ hellomodule.py 
|_ first_script.py 

のようなフォルダ構造を持つ例えば言いますコマンドは

python -m HelloModule/hellomodule

に変更されますと、あなたはHelloModuleディレクトリの外からこのコマンドを実行する必要があります。

関連する問題