回答:
多くの場合、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ファイルを探す必要があるとは限りません。
python3 program_dir、実行されました__init__.py。
python3 dir実行__main__.pyではなく__init__.py、一方python3 -m dirの実行の両方。
__main__.pyのインポートをトリガーしたコードがあります__init__.py
__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
__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が呼び出されたときにファイルが実行されます。
次のように実行可能__main__.pyにyourpackageするために作成します。
$ python -m yourpackage
-mプログラムがモジュールとしてアクセス可能な場合にのみ機能します。それ以外の場合は使用できますpython <yourpackage>注:-mオプションなし
packageですか?
python -m <yourproject>は機能しません-mが、冗長なオプションですが、python <yourpackage>うまく機能します。
aスクリプトa/b/c/__main__.py... python -m b.cを想定すると、ディレクトリから実行されa、メインスクリプトのインポートはに対して相対的になりaます。しかしpython b/c、dirのインポートスコープから実行されるcため、メインスクリプトのようなインポートimport b.dは失敗します。
python -m program_dirとpython program_dir少し異なる:後者は決して実行しない__init__.py(ある場合)ディレクトリに。