7342

次のコードを考えると、 は何をしif __name__ == "__main__":ますか?

# Threading example
import time, thread

def myfunction(string, sleeptime, lock, *args):
    while True:
        lock.acquire()
        time.sleep(sleeptime)
        lock.release()
        time.sleep(sleeptime)

if __name__ == "__main__":
    lock = thread.allocate_lock()
    thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
    thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))
4

39 に答える 39

158

if __name__ == "__main__"のようなコマンドを使用して (たとえば) コマンドラインからスクリプトを実行したときに実行される部分ですpython myscript.py

于 2009-01-07T04:14:23.233 に答える
97

何をしif __name__ == "__main__":ますか?

__name__すべての名前空間に存在するグローバル変数 (Python では、グローバルは実際にはモジュール レベルでの意味) です。通常は、モジュールの名前 (str型として) です。

ただし、唯一の特殊なケースとして、mycode.py のように、どの Python プロセスを実行しても、次のようになります。

python mycode.py

それ以外の場合は匿名のグローバル名前空間には、 の値が'__main__'そのに割り当てられます__name__

したがって、最終行を含む

if __name__ == '__main__':
    main()
  • mycode.py スクリプトの最後に、
  • Python プロセスによって実行される主要なエントリポイント モジュールである場合、

スクリプトの一意に定義されmainた関数が実行されます。

このコンストラクトを使用するもう 1 つの利点: コードを別のスクリプトのモジュールとしてインポートし、プログラムが決定した場合にメイン関数を実行することもできます。

import mycode
# ... any amount of other code
mycode.main()
于 2014-10-14T20:22:55.220 に答える
61

簡単に言うと、__name__スクリプトがメイン モジュールとして実行されているか、インポートされたモジュールとして実行されているかを定義する、スクリプトごとに定義された変数です。

2 つのスクリプトがあるとします。

#script1.py
print "Script 1's name: {}".format(__name__)

#script2.py
import script1
print "Script 2's name: {}".format(__name__)

script1 を実行した結果の出力は次のとおりです。

Script 1's name: __main__

script2 の実行結果は次のとおりです。

Script1's name is script1
Script 2's name: __main__

ご覧のとおり、__name__どのコードが「メイン」モジュールであるかがわかります。コードを書くだけで済み、C/C++ のような構造的な問題を心配する必要がないため、これは素晴らしいことです。ファイルが「メイン」関数を実装していない場合、実行可能ファイルとしてコンパイルできず、実装されている場合は、ライブラリとして使用することはできません。

何か素晴らしいことを行う Python スクリプトを作成し、他の目的に役立つ大量の関数を実装するとします。それらを使用したい場合は、スクリプトをインポートして、プログラムを実行せずに使用できます (コードが if __name__ == "__main__":コンテキスト内でのみ実行される場合)。一方、C/C++ では、これらの部分を別のモジュールに分割して、ファイルをインクルードする必要があります。以下の状況を想像してください。

C での複雑なインポート

矢印はインポート リンクです。それぞれが前のモジュール コードをインクルードしようとする 3 つのモジュールには、6 つのファイル (実装ファイルを数えると 9 つ) と 5 つのリンクがあります。これにより、特にライブラリとしてコンパイルされない限り、他のコードを C プロジェクトに含めることが難しくなります。Python の場合を想像してみてください。

Python でのエレガントなインポート

モジュールを作成し、誰かがあなたのコードを使用したい場合は、それをインポートするだけで、__name__変数はプログラムの実行可能部分をライブラリ部分から分離するのに役立ちます。

于 2016-10-15T09:07:42.043 に答える
35

これは、コマンド ラインから Python ファイルが呼び出された場合の特別な機能です。これは通常、「main()」関数を呼び出すか、コマンドライン引数の処理など、他の適切なスタートアップ コードを実行するために使用されます。

それはいくつかの方法で書くことができます。もう一つは:

def some_function_for_instance_main():
    dosomething()


__name__ == '__main__' and some_function_for_instance_main()

これをプロダクション コードで使用する必要があると言っているわけではありませんが、if __name__ == '__main__'.

これは、Python ファイルでメイン関数を呼び出すための規則にすぎません。

于 2013-01-24T13:48:38.440 に答える
35

答えを深く簡単な言葉で説明するのが最善だと思います:

__name__: Python のすべてのモジュールには、 という特別な属性があります__name__。モジュールの名前を返す組み込み変数です。

__main__: 他のプログラミング言語と同様に、Python にも実行エントリ ポイント、つまり main があります。'__main__' 最上位コードが実行されるスコープの名前です。基本的に、Python モジュールを使用するには 2 つの方法があります。スクリプトとして直接実行するか、インポートします。モジュールがスクリプトとして実行されると、そのモジュールは に__name__設定され__main__ます。

したがって、__name__属性の値は__main__、モジュールがメイン プログラムとして実行されるときに に設定されます。それ以外の場合、値は__name__ モジュールの名前を含むように設定されます。

于 2016-11-30T06:47:44.283 に答える
23

検討:

print __name__

上記の出力は__main__.

if __name__ == "__main__":
  print "direct method"

上記のステートメントは真であり、"direct method"を出力します。このクラスを別のクラスにインポートした場合、インポート中に「ダイレクト メソッド」が出力されないとします__name__ equal to "first model name"

于 2016-06-22T10:47:06.407 に答える
14

この回答は、Python を学習している Java プログラマー向けです。通常、すべての Java ファイルには 1 つの public クラスが含まれます。このクラスは、次の 2 つの方法で使用できます。

  1. 他のファイルからクラスを呼び出します。呼び出しプログラムにインポートするだけです。

  2. テスト目的で、クラスをスタンドアロンで実行します。

後者の場合、クラスには public static void main() メソッドが含まれている必要があります。Python では、この目的はグローバルに定義された label によって提供され'__main__'ます。

于 2018-10-07T04:52:46.110 に答える
10

Python インタープリターが特定のモジュールを実行している場合、__name__グローバル変数の値は次のようになります"__main__"

  def a():
      print("a")

  def b():
      print("b")

  if __name__ == "__main__":

          print ("you can see me")
          a()
  else:

          print ("You can't see me")
          b()

このスクリプトを実行すると、you can see me が出力されます。

a

このファイルをインポートし、A をファイル B に指定してファイル B を実行するとif __name__ == "__main__"、ファイル A が false になるため、 You can't see meと出力されます。

b

于 2019-07-30T16:22:15.500 に答える
9

名前== 'メイン' の場合:

__name__ == '__main__':かなり頻繁に見られます。

モジュールがインポートされているかどうかをチェックします。

つまり、ifブロック内のコードは、コードが直接実行される場合にのみ実行されます。ここでdirectlyは を意味しnot importedます。

モジュールの名前を出力する単純なコードを使用して、それが何をするか見てみましょう。

# test.py
def test():
   print('test module name=%s' %(__name__))

if __name__ == '__main__':
   print('call test()')
   test()

を介してコードを直接実行するpython test.pyと、モジュール名は__main__次のようになります。

call test()
test module name=__main__
于 2018-04-04T14:32:34.617 に答える
7

すべての答えは、機能をほとんど説明しています。しかし、概念をさらに明確にするのに役立つ可能性のある使用例を 1 つ紹介します。

a.py と b.py という 2 つの Python ファイルがあるとします。これで、a.py は b.py をインポートします。「import b.py」コードが最初に実行される a.py ファイルを実行します。a.py コードの残りの部分を実行する前に、ファイル b.py 内のコードを完全に実行する必要があります。

b.py コードには、そのファイル b.py に排他的なコードがいくつかあり、b.py ファイルをインポートした他のファイル (b.py ファイル以外) で実行する必要はありません。

それが、このコード行のチェックです。それがコードを実行しているメイン ファイル (つまり、b.py) である場合、この場合はそうではありません (a.py が実行中のメイン ファイルです)。コードのみが実行されます。

于 2018-05-04T08:25:42.867 に答える