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 ++はどちらも、プログラムのエントリとしてメイン機能を備えている必要があります。つまり、プログラムの操作は主な機能。同様に、JavaとC#には、プログラムエントリとしてMainメソッドを含むメインクラスが必要です。
しかし、Pythonは異なり、スクリプト言語に属しています。コンパイルされた言語とは異なり、プログラムはバイナリにコンパイルされてから実行されますが、行ごとに動的に解釈されます。つまり、スクリプトの最初の行から実行され、統一されたエントリポイントはありません。
直接実行するだけでなく、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にインポートします。
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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を変更し、次の場合に追加しました__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
パッケージでは、ファイルは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__.p
役割
最初に例を見てみましょう。次のパッケージがあるとします。
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パッケージで実行し、結果を出力します。
__main__
['package', ...]
結論として
-mパラメータが追加されると、Pythonは現在の作業ディレクトリをsys.pathに追加します。-mが追加されない場合、Pythonはスクリプトが配置されているディレクトリをsys.pathに追加します。
-mパラメーターが追加されると、Pythonは最初にモジュールまたはパッケージをインポートしてから実行します。
__main__.py
ファイルは、パッケージまたはディレクトリのエントリプログラムです。pythonpackageまたはpython-m packageのどちらで実行されているかに関係なく、__main__.py
ファイルは常に実行されます。