疑問(2)----- Pythonで__name __ == '__ main__'かどうかを簡単に理解する方法

1.まとめ

一般的な理解__name__ == '__main__':あなたがXiaoming.pyと呼ばれている場合、友人の目にはXiaoming(__name__ == '小明')です;あなた自身の目にはあなたはあなた自身(__name__ == '__main__')です。

if __name__ == '__main__'の意味は次のとおりです。.pyファイルを直接実行するとif __name__ == '__main__'、以下のコードブロックが実行されます。.pyファイルをモジュールとしてインポートすると、if __name__ == '__main__'以下のコードブロックは実行されません。

 

2.プログラムエントリー

多くのプログラミング言語では、プログラムにはC、C ++などのエントリポイントと、完全にオブジェクト指向のプログラミング言語であるJava、C#などが必要です。これらの言語に触れたことがある場合は、プログラムエントリの概念を十分に理解している必要があります。CとC ++はどちらも、プログラムのエントリポイントとしてメイン機能を備えている必要があります。つまり、プログラムの操作は次のようになります。 main関数から開始します。同様に、JavaとC#には、プログラムエントリとしてMainメソッドを含むメインクラスが必要です。

ただし、Pythonは異なり、スクリプト言語に属しています。コンパイルされた言語とは異なり、プログラムはバイナリにコンパイルされてから実行されます。代わりに、動的に1行ずつ解釈して実行されます。つまり、スクリプトの最初の行から実行され、統一されたエントリポイントはありません。

直接実行するだけでなく、Pythonソースコードファイル(.py)をモジュール(つまり、ライブラリ)として使用したり、他の.pyファイルからインポートしたりすることもできます。直接実行するかインポートするかに関係なく、.pyファイルの最上位のコードが実行され(Pythonはインデントを使用してコードレベルを区別します)、. pyファイルをモジュールとしてインポートする場合、コードの一部を実行されます。

2.1.pyファイルは他の.pyファイルによって参照されます

次の内容のconst.pyファイルがあるとします。

PI = 3.14

def main():
    print("PI:", PI)

main()

# 运行结果:PI: 3.14

ここで、円の面積を計算するためのarea.pyファイルを作成します。area.pyファイルは、const.pyファイルのPI変数を使用する必要があります。const.pyから、PI変数をarea.pyにインポートします。

from const import PI

def calc_round_area(radius):
    return PI * (radius ** 2)

def main():
    print("round area: ", calc_round_area(2))

main()

'''
运行结果:
PI: 3.14
round area:  12.56
'''

2.2 const.pyを変更し、追加しますif __name__ == "__main__"

const.pyのmain関数も実行されていることがわかります。実際、const.pyが提供するmain関数は定数定義のテスト専用であるため、実行したくありません。このとき、if __name__ == '__main__'便利でした。const.pyを変更して、次のように追加しましたif __name__ == "__main__"

PI = 3.14

def main():
    print("PI:", PI)

if __name__ == "__main__":
    main()

const.pyを実行すると、出力は次のようになります。

PI: 3.14

area.pyを実行すると、出力は次のようになります。

round area:  12.56

上記のように、if __name__ == '__main__'Pythonシミュレーションと同等のプログラムエントリを見ることができます。Python自体はこれを規定しておらず、単なるコーディングの習慣です。モジュール間の相互参照により、異なるモジュールにそのような定義がある場合がありますが、プログラムエントリは1つだけです。どのプログラムエントリが選択されるかは__name__、値によって異なります。
 

3.3。 __name__

3.1 __name__パッケージの構造を反映する

__name__これは、パッケージの構造を反映するために使用できる組み込み変数です。パッケージaがあるとすると、パッケージの構造は次のようになります。

a
├── b
│   ├── c.py
│   └── __init__.py
└── __init__.py

パッケージaではc.py,__init__.py,__init__.pyファイルの内容は次のとおりです

print(__name__)

.pyファイル(モジュール)が別の.pyファイル(モジュール)によってインポートされると、コマンドラインで実行されます

python -c "import a.b.c"

出力結果:

a
a.b
a.b.c

これは__name__、パッケージ内のモジュールのレベルを明確に反映できることを示しています。

3.2__name__現在のモジュールの名前を表し ます

__name__これは、現在のモジュールの名前を表すために使用できる組み込み変数です。.pyファイル(モジュール)を直接実行します

python a/b/c.py

出力結果:

__main__

これから、次のことがわかります。.pyファイル(モジュール)が直接実行される場合、パッケージ構造はなく、その__name____main__はモジュール名__main__です。

つまり、if __name__ == '__main__'.pyファイルを直接実行するとif __name__ == '__main__'、以下のコードブロックが実行されます。.pyファイルをモジュールとしてインポートすると、if __name__ == '__main__'以下のコードブロックは実行されません。

 

4. __main__.pyドキュメントとpython -m

Pythonの-mパラメータは、モジュールまたはパッケージをスクリプトとして実行するために使用され、__main__.pyファイルはパッケージの「エントリプログラム」に相当します。

4.1Pythonプログラムを実行する2つの方法

  • python xxx.py、xxx.pyファイルを直接実行します
  • python -m xxx.py、xxx.pyをモジュールとして実行します

次の内容のファイルrun.pyがあるとします。

import sys

print(sys.path)

直接実行することから始めます

python run.py

出力結果(問題を説明するために、出力結果の重要な部分のみがインターセプトされます。以下と同じです)。

['/home/huoty/aboutme/pythonstudy/main', ...]

次に、モジュールとして実行します。

python -m run.py

出力コンテンツ

['', ...]
/usr/bin/python: No module named run.py

出力には重要な部分のみがリストされているため、それらの違いを簡単に確認できます。

  • 直接操作の方法は、run.pyファイルが配置されているディレクトリをsys.path属性に配置することです。

  • モジュールモードで実行するには、コマンドを入力したディレクトリ(つまり、現在の作業パス)をsys.path属性に配置します。

モジュールモードで実行する場合、別の違いがありNo module named run.pyます。余分なエラー行があります。実際、モジュールとして実行する場合、Pythonは最初にrun.pyへのインポートを実行するため、print(sys.path)正常に実行され、次にPythonはrun.pyモジュールを実行しようとしますが、パス変数にrun.pyモジュールがありません。そのため、エラーが報告されます。正しい操作方法は、である必要がありますpython -m run

4.2 __main__.py役割

最初に例を見てみましょう。次のパッケージがあるとします。

package
├── __init__.py
└── __main__.py

その中__init__.pyで、ファイルの内容

import sys

print("__init__")
print(sys.path)

その中__main__.pyで、ファイルの内容

import sys

print("__main__")
print(sys.path)

次に、このパッケージを実行し、runを使用してpython -m package、結果を出力します。

__init__
['', ...]

__main__
['', ...]

python package操作を使用すると、出力結果は次のようになります。

__main__
['package', ...]

結論として

  • -mパラメータが追加されると、Pythonは現在の作業ディレクトリをsys.pathに追加します。-mが追加されない場合、Pythonはスクリプトが配置されているディレクトリをsys.pathに追加します。

  • -mパラメーターを追加すると、Pythonは最初にモジュールまたはパッケージをインポートしてから実行します。

  • __main__.pyファイルは、パッケージまたはディレクトリのエントリプログラムです。使用するpython packagepython -m package実行するかに関係なく__main__.pyファイルは常に実行されます。
     

5.参考記事

 1.Pythonでname == ' main 'どうかを理解する 方法

おすすめ

転載: blog.csdn.net/dongjinkun/article/details/113774675