17

重複の可能性:
<if __name__==“__main__”:> は何をしますか?

だから私はpyscripterを起動し、これを含むファイルを取得します:

def main():
    pass

if __name__ == '__main__':
    main()

それは何ですか?それがなくてもプログラムが機能するのはなぜですか? 一体これは何の目的で?私のコードはどこに行きますか?hello world を出力する関数を考えてみましょう。それはどこに行くのでしょうか?私はそれをどこで呼びますか?

4

5 に答える 5

14

基本的に、スクリプトがそれ自体で直接実行される場合に限り、中央のエントリポイントを定義できるようにすることが目的です。それが単独で実行される場合、__name__これまでに等しいだけになるからです。'__main__'スクリプトの実際のコンテンツを別の関数に入れると、他のスクリプトがその関数をインポートして、必要なときにいつでも実行できるため、スクリプトがインポートされてもすぐには実行されません。

これは、ライブラリモジュールでよく使用され、何かがすぐに必要なときにデフォルトの動作をします。たとえば、このhttp.serverモジュールは、考えられるあらゆる機能を備えた独自のHTTPサーバーを作成するための幅広い機能を提供します。単純なサーバーでファイルを静的にリッスンして渡すだけの場合は、コマンドラインから実行するときにモジュールのデフォルトの動作を使用できます。

python3 -m http.serverコマンドラインで実行すると、まさにそれが実行されます。モジュールを実行しhttp.serverます。モジュール自体は、その__name__ == '__main__ブロックで単純なHTTPサーバーを起動します。

あなたのコメントに応えて:

mainライブラリとして機能し、型または関数を含む通常のモジュールの場合、アプリケーションに必要なものであり、関数またはメインブロックは必要ありません。直接呼び出されるスクリプトの場合、たとえば、実際にアプリケーションを起動する開始スクリプトの場合、関数やクラスにカプセル化されていないが直接実行されるある種のコードがあります。それは何かでしょう、あなたはそれからあなたが別々に呼び出すメイン関数を入れることができます。これにより、そのコードを配置する場所にもう少し自由度が加わります。たとえばmain、ファイルの先頭に直接関数を設定し、その中で呼び出される追加の関数をファイルのさらに奥に定義することができます。そして、スクリプトの最後の部分はmain()です。あなたは必ずしもそれをに入れる必要はありませんif __main__ == '__main__':条件、あなたはそれを直接呼び出すことができます。たとえば、スクリプトは次のようになります。

def main ():
    # doing something
    utilityFunction(...)
    otherUtilityFunction(...)

def utilityFunction (...):
    ...
def otherUtilityFunction (...):
    ...

main()

コードを別の関数に配置しない場合は、(関数定義の後で)下部ですべての処理を実行する必要があります。これは、次の場合に何を実行するかをすばやく確認したい場合は逆効果になる可能性があります。スクリプトは直接呼び出されます。

さて、私が言ったように、それをメインコンディションブロックに入れる必要はありません。直接呼び出すことができます。ただし、何らかの理由でそのファイルを含める必要がある場合、たとえば、ファイルを他の何かにカプセル化したい場合、またはインタラクティブシェル(IDLEなど)から繰り返し呼び出したい場合は、おそらくそうしません。モジュールをインポートするmain()ときはいつでも実行したいが、実際にその機能を実行したいときだけ。main()ここで、を条件に入れる必要があります。そうすれば、モジュールを直接実行しない限り、実行されません。

一般に、呼び出しを常にそのような状態にすることは悪い考えmain()ではありません。それは決して傷つくことはありませんが、後で役立つことがよくあるからです。

于 2012-11-10T16:38:03.260 に答える
4

__name__グローバルは、Pythonファイルを実行するときにに設定され、__main__ファイルをインポートすると、その名前に設定されます。

この構成により、ファイルが実行された場合にのみ、一部のコードを実行できます。たとえば、ファイルがある場合mymain.py

def main():
    print('Hello, World!')


if __name__ == '__main__':
    main()

次の結果が得られます。

$ python mymain.py
Hello, World!
$ python
Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mymain    # main() *not* executed
>>> mymain.main()
Hello, World!

コードを実行せずにファイルをインポートできると便利なことがよくあります。このようにして、新しいプロセスを作成したり、実行する前にいくつかの変更を加えたりすることなく、サードパーティのソフトウェアからメイン関数を呼び出すことができます。

したがって、必須ではありませんが、使用することをお勧めします。多くの場合、プログラムの一部の関数/クラスが他のプログラムによって役立つ可能性があることに気付くでしょう。したがって、メインプログラムを実行せずにファイルをインポートできることは良い習慣です。

if __name__ == '__main__':ブロックを持っているJavaと比較すると、mainメソッドだけを持ち、他のクラスを使用して仕事をするクラスを持っているようなものですが、使用していないのは、main他の機能(たとえば、ある種のコンテナなど)も提供するクラス内にメソッドを持っているようなものです。mainメインプログラムを実行するメソッドもあります)。

于 2012-11-10T16:39:20.817 に答える
2

Pythonのすべてはステートメントであり、宣言のようなものはありません(たとえば、adefは関数オブジェクトを作成し、それを名前にバインドするステートメントです)。モジュールのインポートとは、(何らかの簿記の後で)モジュール内のステートメントを実行することを意味します。同様に、Pythonファイルを実行するということは、それをモジュールとしてインポートすることを意味します。したがって、モジュールレベルのステートメントとしてプログラムを作成するだけで機能します。

しかしもちろん、これは再利用できません。「プログラム」が他のモジュールにもインポート可能である必要がある場合は、それを関数に入れます(そして、他にもいくつかのマイナーな利点があります)。しかし、ファイル(python file.py)を実行しても、その関数を定義する以外に何もしません。

モジュール名であり、「エントリポイント」モジュール__name__と同じであると入力します。'__main__'したがって、条件は、モジュールがインポートされたかスクリプトとして実行されたかをチェックし、後者の場合はその役割を果たします。

于 2012-11-10T16:40:26.360 に答える
0

「Helloworld」では実際にはこのトリックは必要ありませんが、モジュールを作成する場合に役立ちます。このif __name__ == '__main__'句はmain()、スクリプトが直接実行された場合にのみ実行され、別のスクリプトからのインポートとして使用された場合には実行されません。

于 2012-11-10T16:38:28.843 に答える
0

アイデアは非常に単純です。ファイルをパッケージ (どこかにインポートするもの) または純粋なスクリプトの両方として使用できます。ファイルがスクリプトとして使用される場合、Python のインタープリター変数 " "には、パッケージ名の代わりに__name__" " が含まれます。__main__

そこで、 が に設定されているかどうかをテスト__name____main__ます。これは、スクリプト モードであることを意味します。設定されている場合は、「if」ブロック内のコードを実行します。

Java と Python の主な違いを理解する必要があります。Python では、インタープリターがファイルを読み取ると、ファイルが実行されます --> 宣言とコードの両方が解釈され、Python の多くの機能はそれに基づいています。

于 2012-11-10T16:45:14.820 に答える