質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Python 3.x

    6831questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

__name__ == '__main__':の実行方法

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 141

midsum0323

score 24

基本的なことで恐縮ですが、
たとえば

def test():
    print('Hello World!')

if __name__ == '__main__':
    test()

のような
実行部分が
name == 'main':
の場合、SpyderやJuypterNotebookで実行できるのでしょうか。
実行できない場合、どのように改変すればSpyderやJuypterNotebookで実行すればよろしいのでしょうか。
不可能な場合どのような方法で実行できるのでしょうか。

入門書とか読んでもよくわからないので教えていただけないでしょうか。

場違いかもしれませんがよろしくお願い申し上げます。

環境
Windows10
Python3.6
Anaconda3を使用

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

if __name__ == '__main__':


の意味について。

上記は一言で言ってしまえば、「ライブラリとして読み込んだ時の実行防止」のためにあります。

例示されたような内容のtest.pyというファイルがあったとします。
これを直接実行する場合、すなわち

$ python test.py


と実行した場合、上記のif文のある名前空間(と言っていいのかな?識者のフォロー求む)モジュール名は__main__となります。

一方、このtest.pyを、test関数を提供するライブラリとしてimportする場合。

import test

test()


上記のようなtest2.pyがあったとします。
この場合、test関数が実行される回数は、さて何回でしょう?

・・・答えは1回、test2.pyの中でのみ実行されます。
なぜならば、importしたtest.pyの中では、モジュール名を示す__name__の値はtestとなるからです。

この仕組みにより、「直接実行した場合にだけ、何か処理を行う」という機能と、「ライブラリとして機能を使いまわしたい場合に余計なことをしない」機能の両立がなされるというわけです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/18 10:20

    > if文のある名前空間(と言っていいのかな
    そう言えば正式にはどう区別して呼ぶのかと思って私も確認してしまいましたが、python公式を見ると、“__name__”属性はpython2でも3でも
    https://docs.python.org/2.7/library/stdtypes.html?highlight=__name__#definition.__name__
    https://docs.python.org/3/reference/import.html?highlight=__name__#__name__
    「モジュール名(name of module)が入る」となっていて、そうかと思って “__main__” の説明を見てみると今度は
    https://docs.python.jp/3/library/__main__.html
    「トップレベルのコードが実行されるスコープの名前(name of the scope in which top-lelvel code executes))」
    となっていて、pythonの名前空間と言うわけでもなさそうに思うも、意味的には重なりそうでもあって、ちょっと混乱しますね。

    キャンセル

  • 2018/05/18 10:51

    フォローありがとうございます!
    基本はモジュール階層を一意に識別するためのモジュール名が入っていて、トップレベルのモジュール名が疑似的に"__main__"として定義されている、という雰囲気でしょうかね。
    他の言語でいう「namespace」とはちょっと違いますから、説明の中で名前空間と言ってしまうと混乱しそう。直します。

    キャンセル

0

Spyderで普通に実行できました。
ただ、処理速度はそんなに早くないですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/18 07:20

    if文の実行速度の話ですか?←処理速度

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    6831questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。