2012-11-10 6 views
12

可能性の重複:
What does <if __name__==“__main__”:> do?私はPythonのメインブロックを理解していません。そのことは何ですか?

だから私はpyscripterを起動し、私はそれでこれを使用してファイルを取得する:

def main(): 
    pass 

if __name__ == '__main__': 
    main() 

それは何ですか?なぜ私のプログラムもそれなしで動作しますか?とにかくこれの目的は何ですか? 私のコードはどこに行きますか?こんにちは世界を印刷する関数を言うことができます。それはどこに行くのだろうか?私はどこでそれを呼ぶだろうか?

+0

なぜ、これらの重複しているすべてのアップノートが表示されますか? – none

+1

この質問は非常に幅広いサブ疑問文を網羅していますので、上記で指摘したその他の質問や詳細についてはお答えしません。 – user836087

答えて

12

基本的には、スクリプトがそれ自身で直接実行される場合にのみ、セントラルエントリポイントを定義することができます。 __name__は、それ自身が実行される場合に限り、'__main__'に等しくなります。スクリプトの実際のコンテンツを別の関数に入れると、他のスクリプトがその関数をインポートしていつでも実行できるので、スクリプトのインポート時にすぐに実行されません。

これは、何かをすばやく必要とするときにデフォルト動作をするために、libaryモジュールでよく使用されます。たとえば、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()コールをこのような状態にするのは悪いことではありません。それは決して傷つくことはありませんが、しばしば後で役に立ちます。

+2

'' __name__''は '' __main__''と同じであるという主張をしていますコマンドラインから実行します。本質は真実ですが、それは厳密には事実ではありません。Pythonスクリプト内からそのコードを実行することは可能です。つまり、明示的に行う必要があります。 (例: '' imp.load_module() '')。 –

+0

@Lattyware良い点は、私の答えを修正しました。 – poke

+0

ポケ。理解できません。いつ私のコードにメインブロックを置くべきですか?私は20のpythonファイルの依存関係、大きなプログラムを持っていると言うことができます。主な意味はどこにありますか? – user836087

0

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

3

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

この構成では、ファイルが実行された場合にのみコードを実行できます。あなたはこの結果を得る

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! 

たとえば あなたはファイルmymain.pyを持っている場合。このようにして、主要な機能は、新しいプロセスを作成したり、実行する前にいくつかのことを変更することなく、サードパーティのソフトウェアによって呼び出すことができます。

したがって、必ずしも必要ではありませんが、使用することをお勧めします。しばしば、プログラムのいくつかの関数/クラスは他のプログラムによって有用であるかもしれないので、メインプログラムを実行しないでファイルをインポートできることは良い方法です。 if __name__ == '__main__':ブロックを持つJavaへの比較

(それはまた、他の機能を提供するクラスの内部mainメソッドを持っているようなものです使用していないが、唯一のmain方法を持っており、彼の仕事をするために他のクラスを使用するクラスを持っているようなものです例えば、ある種のコンテナか、またはメインプログラムを実行する方法であるmain)である。

2

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

もちろん、これは再利用できません。 "プログラム"も他のモジュール用にインポート可能でなければならないときは、それを関数に入れます(他にもいくつかの小さな利点があります)。しかし、ファイル(python file.py)を実行すると、その機能を定義するだけのことはありません。

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

0

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

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

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

関連する問題