__main__.pyとは何ですか?


326

何である__main__.pyため、ファイルが、私はそれにソートコードの何を入れなければならない、とするとき私は1つを持っている必要がありますか?

回答:


320

多くの場合、Pythonプログラムはコマンドラインで.pyファイルに名前を付けることによって実行されます。

$ python my_program.py

コードでいっぱいのディレクトリまたはzipファイルを作成し、を含めることもできます__main__.py。次に、コマンドラインでディレクトリまたはzipファイルに名前を付けるだけで、__main__.py自動的に実行されます。

$ python my_program_dir
$ python my_program.zip
# Or, if the program is accessible as a module
$ python -m my_program

このように実行することでアプリケーションにメリットがあるかどうかを自分で判断する必要があります。


通常、__main__ モジュール__main__.pyファイルからのものではないことに注意してください。できますが、通常はできません。のようなpython my_program.pyスクリプトを実行すると、スクリプトは__main__モジュールではなくモジュールとして実行されmy_programます。これはpython -m my_module、として、または他のいくつかの方法で実行されるモジュールでも発生します。

__main__エラーメッセージに名前が表示された場合、必ずしも__main__.pyファイルを探す必要があるとは限りません。


22
私が見つかりました。python -m program_dirpython program_dir少し異なる:後者は決して実行しない__init__.py(ある場合)ディレクトリに。
brk 2018年

5
@brk:今はそうではないようです。私は試してみましたがpython3 program_dir、実行されました__init__.py
mk12

@ MK12私はちょうど私がBRKの調査結果@確認することができ、それを試してみました:python3 dir実行__main__.pyではなく__init__.py、一方python3 -m dirの実行の両方。
マルチェロロマーニ

1
@ mk12おそらく、コード__main__.pyのインポートをトリガーしたコードがあります__init__.py
wim

100

__main__.pyファイルの目的は何ですか?

Pythonモジュールを作成する場合main、プログラムのエントリポイントとして実行すると、モジュールに一部の機能(通常は関数に含まれる)を実行させることが一般的です。これは通常、ほとんどのPythonファイルの下部に次の一般的なイディオムを配置して行われます。

if __name__ == '__main__':
    # execute only if run as the entry point into the program
    main()

を使用すると、Pythonパッケージに対して同じセマンティクスを取得できます__main__.py。これはLinuxシェルプロンプト$です。WindowsにBash(または別のPosixシェル)がない場合は、これらのファイルをsのdemo/__<init/main>__.py間にコンテンツを置いて作成しますEOF

$ mkdir demo
$ cat > demo/__init__.py << EOF
print('demo/__init__.py executed')
def main():
    print('main executed')
EOF
$ cat > demo/__main__.py << EOF
print('demo/__main__.py executed')
from __init__ import main
main()
EOF

(Posix / Bashシェルでは、各catコマンドの最後にファイル終了文字+ を入力することにより、<< EOFsとsで終わることなく上記を実行できます)EOFCtrlD

そして今:

$ python demo
demo/__main__.py executed
demo/__init__.py executed
main executed

ドキュメントからこれを導き出すことができます。ドキュメントは言います:

__main__ —トップレベルのスクリプト環境

'__main__'トップレベルのコードが実行されるスコープの名前です。モジュールの__name__'__main__'、標準入力、スクリプト、または対話型プロンプトから読み取られたときと同じに設定されます。

モジュールは__name__、それ自体をチェックすることで、メインスコープで実行されているかどうかを検出できます。これにより、モジュールpython -mがスクリプトとして実行されたとき、またはインポートされたときではなく、モジュール内のコードを条件付きで実行するための一般的なイディオムが許可されます。

if __name__ == '__main__':
      # execute only if run as a script
      main()

パッケージの場合は、__main__.pyモジュールを含めることで同じ効果が得られ ます。その内容は、モジュールをで実行したときに実行されます-m

圧縮

これを単一のファイルにパッケージ化して、次のようにコマンドラインから実行することもできます。ただし、zipパッケージでは、サブパッケージまたはサブモジュールをエントリポイントとして実行できないことに注意してください。

$ python -m zipfile -c demo.zip demo/*
$ python demo.zip
demo/__main__.py executed
demo/__init__.py executed
main() executed

31

__main__.pyPythonプログラムのzipファイルで使用されます。__main__.pyzipファイルがで実行すると、ファイルが実行されます。たとえば、zipファイルが次のとおりだった場合:

test.zip
     __main__.py

の内容__main__.py

import sys
print "hello %s" % sys.argv[1]

それから私たちが走るpython test.zip worldとしたら、私たちはhello world外に出るでしょう。

そのため__main__.py、zipファイルでPythonが呼び出されたときにファイルが実行されます。


23

次のように実行可能__main__.pyyourpackageするために作成します。

$ python -m yourpackage

1
-mプログラムがモジュールとしてアクセス可能な場合にのみ機能します。それ以外の場合は使用できますpython <yourpackage>注:-mオプションなし
Benyamin Jafari

1
@BenyaminJafari モジュールとしてアクセスできないコマンドラインPythonプログラムを作成することはできません。たぶんあなたが意味したのpackageですか?
anatly techtonik

1
メインの .py を含むPythonパッケージを作成するとき、それを実行することpython -m <yourproject>は機能しません-mが、冗長なオプションですが、python <yourpackage>うまく機能します。
Benyamin Jafari

@BenyaminJafari -mフラグは、場合によっては違いを生じます。ディレクトリから実行し、aスクリプトa/b/c/__main__.py... python -m b.cを想定すると、ディレクトリから実行されa、メインスクリプトのインポートはに対して相対的になりaます。しかしpython b/c、dirのインポートスコープから実行されるcため、メインスクリプトのようなインポートimport b.dは失敗します。
MikeCPT

14

スクリプトが単一のpythonファイルで__main__.pyはなくディレクトリまたはZIPファイルの場合、「スクリプト」が引数としてpythonインタープリターに渡されたときに実行されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.