8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Python の__main__関連。import __main__でできること。

Posted at

#目的
Pythonにおいて、以下の1行の意味の説明には、わりと最初に出会う。

if __name__ == '__main__':

これで、__main__の特殊性を理解するが、

すぐには説明に出会わない以下の2つの例に出会ったのでメモを残す。

 ・__main__.pyファイルの意味
 ・import __main__

#__main__.pyファイルの意味

たとえば、「pip」に関して、
以下のディレクトリに__main__.pyというファイルがある。
・・・・\Python37\Lib\site-packages\pip

この__main__.pyの作用に関しては、stackoverflowの以下の記載が参考になる。
https://stackoverflow.com/questions/4042905/what-is-main-py
翻訳して引用する。

多くの場合、Pythonプログラムはコマンドラインで.pyファイルを指定することによって実行されます。
$ python my_program.py
コードでいっぱいのディレクトリまたはzipファイルを作成し、__ main__.pyを含めることもできます。 その後、コマンドラインでディレクトリまたはzipファイルに名前を付けるだけで、自動的に__main__.pyが実行されます。
$ python my_program_dir
$ python my_program.zip
#または、プログラムがモジュールとしてアクセス可能な場合
$ python -m my_program
あなたのアプリケーションがこのように実行されることから利益を得ることができるかどうかあなた自身で決める必要があるでしょう。

ちなみに、内容は、以下(全文)。

from __future__ import absolute_import

import os
import sys

# If we are running from a wheel, add the wheel to sys.path
# This allows the usage python pip-*.whl/pip install pip-*.whl
if __package__ == '':
    # __file__ is pip-*.whl/pip/__main__.py
    # first dirname call strips of '/__main__.py', second strips off '/pip'
    # Resulting path is the name of the wheel itself
    # Add that to sys.path so we can import pip
    path = os.path.dirname(os.path.dirname(__file__))
    sys.path.insert(0, path)

from pip._internal import main as _main  # isort:skip # noqa

if __name__ == '__main__':
    sys.exit(_main())

#import __main__ の使い方

以下の書籍で説明されている例を示す。

Effective Python ―Pythonプログラムを改良する59項目
Brett Slatkin (著), 石本 敦夫 (監修), 黒川 利明 (翻訳)

製品コードとデバッグコードの使い分けとして、

dev_main.py
TESTING = True
import db_connection
db = db_connection.Database()
prod_main.py
TESTING = False
import db_connection
db = db_connection.Databese()
db_connection.py
import __main__ #★★これ

class TestingDatabese(object):
    # ...

class RealDatabese(object):
    # ...

if __main__.TESTING: #★★これ
    Database = TestingDatabase
else:
    Database = RealDatabase

これで合理的に運用できるでしょうという説明。
しかし、複雑なものの場合は、専用の設定ファイルへの移行と考えるべき
とのコメントあり。

#まとめ
__main__に関して、理解していなかったものに出会ったので、メモを書いた。

#関連(本人)

pythonをストレスなく使う!(generatorに詳しくなる。since1975らしい。)
pythonをストレスなく使う!(Pythonでは、すべてがオブジェクトとして実装されている)
pythonをストレスなく使う!(Pylintに寄り添う)
pythonをストレスなく使う!(ExpressionとStatement)
英語と日本語、両方使ってPythonを丁寧に学ぶ。

#今後
コメントなどあれば、お願いします。:candy:
勉強します、、、、

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?