-m、原則と分析進化中のPythonの典型的な使用

次のようにコマンドラインでPythonを使用する場合、それは20のオプション(オプション)について受け取ることができ、構文は次のとおりです。

python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args]

:この記事では、より特別な「-m」オプション話したいことの一般的な使用方法、原則と分析進化過程を。

まず、その説明を参照しての使用「--help」をしてみましょう。

-mは、スクリプト(終了オプションリスト)として、ライブラリモジュールを実行MOD

「モッズ」は「-m」オプションの内容の背後にある「モジュール」、の略で、その役割モジュールとしてスクリプトを実行することであるモジュール(モジュール)、です。

「終了オプションリスト」手段「-m」が仕事をしませんした後、他のオプションは、この時点で「-c」とは、同一のある「究極のオプション。」公式には「インターフェイスオプション」(インタフェースオプション)、その他の一般的なオプションまたは一般的なオプションと区別する必要があるとして、それらを定義します。

-mオプションの五の一般的な使用

Pythonは-mオプションを使用してシーンをたくさん持っている、私たちはここで私は5を共有したいと思い、それを使用するか、見て可能性があると信じています。

python3では、ただ1行のコマンドでは、単純なHTTPサービスを実装することができるようになります。

python -m http.server 8000

# 注:在 Python2 中是这样
python -m SimpleHTTPServer 8000

実行後、マシンを開く「HTTP:// localhostを:8000」、またはLAN内の他のマシン上で開いて、「HTTP://ネイティブIP:8000」、例えば、実行するディレクトリの内容にアクセスすることができます図は私の母国コンテンツです。

同様に、我々は唯一の1行のコマンドを必要とする「のpython -m pydoc -p XXX」、公式には、ブラウザでアクセスすることができるHTML形式のヘルプドキュメントを生成することができます。

上記のコマンドはpydocモジュールは9000でHTTPポートサービスを開始します実行され、ブラウザで開かれ、私の結果は次の通りです:

それは「xxx.py」スクリプトを実行するには、デバッグモードでは、「パイソン-m PDB xxx.py」PDBデバッグコマンドを実行するために第三一般的に使用されています。

第四のシナリオでは、はtimeitによってコマンドラインでコードの一部全く役に立たない同じ試験実行時間です。次のコード3のセクション、スプライシング「0-1-2- ...... -99」さまざまな方法で数字列。これは、直感的にその効率の違いを見ることができます。

「のpython -mピップXXXインストール」:最後に、シーンがしばしば見落とさあります。私たちは、習慣的に「のpython -m」と前を指定しない短いで、「XXXインストールPIP3」「ピップはXXXのインストール」を使用、または区別とバージョンを行うことができます。しかしながら、そのようなアプローチは、問題であり得ます。

偶然にも、今月初め(2019年11月1日)、Pythonのコア開発者、運営委員会の最初のセッション「ブレット、キャノンの5人のメンバーの一人は、ブログの記事を書いた-m PythonのPIP」を使用する理由」 python -mピップ「アプローチと詳細な説明を「提示して使用する必要があります」。

彼の主なポイントは次のとおりです。Python環境の複数のバージョンがあり、このようなアプローチは、正確に三者ライブラリーの取り付け位置を制御することができます。たとえば「python3.8 -mピップ」については、明示的にバージョン3.8をインストールするために指定することができ、かつ他のバージョンに混同されることはありません。

(参考資料:短い誘導を持つブレット、記事「もともとは、私は、Pythonライブラリ姿勢をインストールする必要は権利ではありません!」)

2つの原則を解決するには-mオプション

いくつかの典型的な使用法のフロントを読む、あなたは不思議に始めた:「-m」それがどのように動作しますか?それはどのように達成することですか?

:「のpython -m名」、単語の説明については、Pythonの取り出しsys.pathと(名前空間のパッケージを含む)モジュールやパッケージの名前を「名前」を探し、「__main__」モジュールなどその内容。

図1に示すように、一般的なモジュールの

『-m』を使用した後、唯一のモジュール名を使用する必要がある場合「の.py」サフィックスファイルは、モジュールであると、サフィックスを記述する必要はありませんが、モジュール名が有効であり、C言語を使用することができない場合にのみ、書かれたモジュール。

それは無効なモジュール名が「-m」した後、それが「いいえモジュールの名前XXX」をエラーなくなります。

接尾辞モジュール場合は、最初のモジュールに導入され、与えられたことがあります。エラー「xxx.py」のモジュールの仕様を見つけながら(はAttributeError:モジュール「XXX」には属性「__path__」がありません。

通常のモジュールのために、時には一見両方のバージョンは同じです。

スクリプトエントリを行うように両方のバージョンは、すなわち、実行されると、スクリプトは、メインプログラムモジュールに配置された__name__インポート・モードで導入「__main__」は、異なっています。

ディレクトリの実装で「test.py」の存在、そして唯一の「テスト」のモジュールがあります。しかし、それは前提です。この例では、ディレクトリたとえば、コースの「Pythonのtest.py」のために、エラーファイルを報告します場合は見つけることができない、しかし、「パイソン-mテスト」が、横断中通訳がいるので、文句を言わないだろうsys.pathときに、同じ名前見つけることができます「テスト」モジュール、および実行します。

したがって差が、実際には、私たちは「-m」使用まとめることができます。モジュールの名前を知られているが、そのファイルパスがわからない、そして自分自身の通訳を見つけるために「-m」の手段を使用し、見つかった場合は、その後、スクリプトの実行など。

一例として、前のテキスト「のpython -m http.server 8000」、我々はまた、これは非常に面倒になるだろうにも関わらず、実行して、絶対パス「サーバー」モジュールを見つけることができます。

だから、 - スクリプトを実行するための直接的な方法と比較すると、「M」、それは達成するためにどのような違いを生むだろうか?

  • 直接スクリプトを実行し、インタプリタによれば、スクリプト(いずれかの絶対または相対パス)への完全なパスの等価を与え、ルックアップメカニズムファイルシステムスクリプトに移動して実行
  • 輸入せずに、通訳のニーズを「-m」モードを使用すると、すべてのモジュールの名前空間、検索スクリプトへのパスに移動し、その後、実行しました。このプロセスを達成するために、インタプリタは、2つのモジュールを用いて次のようになりますpkgutilと、runpy前者はモジュール名に合わせて配置されているすべてのモジュールのリストを取得するために使用して、スクリプトを実行します

図2に示すように、インナーバッグモジュール

あなたはパッケージが「-m」になった後に実行したい場合は、前述の検索プロセスを通じてインタプリタは、最初のパッケージを探し、その「__main__」サブモジュールの実装に行くだろう、それはパッケージディレクトリに、と言うことです「__main__.py」ファイルを達成するために必要。

換言すれば、パッケージの名前を仮定すると、「PNAME」、次いで、ある「パイソン-m PNAME .__ MAIN__」に相当する「パイソン-m PNAME」、実際には、。

それでもHTTPサービスを作成するためのテキストは、例えば、「HTTP」は、内蔵のPythonパッケージである「-m」モードを実行するとき、それはエラーになります使用して、それは、ない「__main__.py」ファイルを行います前にします。http .__ MAIN__という名前のモジュール; ' HTTPは「パッケージで、直接実行することはできません。

比較として、我々は前述のピップを見ることができる、それがパッケージされ、そしてなぜ「のpython -mピップ」それを使用する方法は?もちろん、それは「__main__.py」ファイルを持っているので。

実際に実行される「パイソン-m PIPが」主「pip._internal.main」のコアと呼ばれるコールエントリとして使用され、この「__main__.py」ファイルです。

HTTPための統一入学モジュールの単一入力モジュールは、道の使用ので、ありません「のpython -mパッケージが。モジュール」、およびPIPパッケージため、パッケージ、「__main__.py」ファイルの追加ので、最終的にはちょうど "書きますpython -mパッケージ」、簡潔かつ直感的。

十年の進化の-mオプション

まず-mオプションは、Python 2.4版(2004)で導入された、機能は非常に内蔵されたモジュール(例えばPDBやプロフィールなど)だけ共通に限定されていました。

その後、よく知られている開発者ニック・コフランが提案した「PEP 338 -スクリプトASモジュールを実行する」新たなレベルにその機能を強化します。2004年のPEPは、2006年に提案し、最終的にはバージョン2.5インチ

(余談INSERT:ニック・コフランは、コアのコア開発者の一人で、彼は2005年のコア開発者として選ばれた材料を探していたときに覚えて運営委員会の最初のセッションの5人のメンバーの一人、これです。密着した時間と時間PEP-338)

PEPいくつかのコア・ポイントは次のとおりです。

  • PEP-302(新しいインポートフック)の新たなプローブの結合機構は、カプセル化されたモジュールの外観を解釈する能力を高めるために

  • (例えば、導入された他の結合機構zipimportとモジュール(凍結モジュール)凍結)の範囲と精度を見つけるために、拡張インタプリタモジュール

  • 新開発されたrunpy.run_module(modulename)、それは簡単に他のインタプリタに移植することができますので、CPythonのインタプリタを変更せずに、この機能を達成するために

このように、-mオプションは、すべての名前空間内の所与のモジュールへのPythonコマンドラインように配置されてもよいです。

2009年には、Pythonの3.1バージョン、パッケージに与えられた名前だけ、「__main__」サブモジュールを見つけて実行することができるようになります。2014年、サポート名前空間のパッケージへの拡張-m。

この時点で、進化の十年後、-mオプションは本格的な、完全に機能するようになります。

最後に、我々はそれを終了しに来る:成分と容易にする際の標準的なパッケージのライブラリを容易にするため、内蔵のモジュールを使用し、-mオプションは取るに足りないように見えるかもしれないが、それは間違いなく、コマンドラインを作る最も特別なオプションの一つであります。、それを使用することが経験に喜びをもたらす体験する機会があります。

リファレンス

https://docs.python.org/3.7/using/cmdline.html#cmdoption-m

https://snarky.ca/why-you-should-use-python-m-pip

https://www.python.org/dev/peps/pep-0338/

https://blog.csdn.net/jian3x/article/details/89556592

公開番号[ Pythonの猫 ]、記事の質の高いシリーズのシリアル番号は、哲学的な猫があるニャースターシリーズ、Pythonのアドバンスシリーズ、推奨叢書、テクニカルライティング、そしてお勧めの高品質な英語の翻訳など、ああ、注意歓迎。

おすすめ

転載: www.cnblogs.com/pythonista/p/11829632.html