TIL 13 | Python Main module, Absolute path


多くのプログラミング言語には主関数の概念がある.main関数はプログラムの開始位置として使用されます.たとえば、実行可能ファイルを作成するには、C、C++などのプログラミング言語にmain関数が必要です.main関数を使用するプログラミング言語はmain関数を起点とし,ここにユーザ関数を加える方式でプログラムを記述する.
Pythonにはメイン関数がなく、メインモジュールがあります.最初に実行されるモジュールは、名前に関係なくメインモジュールになります.
モジュールがプライマリ・スクリプトとして実行されるかどうかを確認するための一般的な方法は、次のとおりです.△多くの人によく知られているかもしれません.

if __name__ == '__main__':
    ...
すべてのPythonファイルがプライマリファイルとして実行またはインポートされ、ライブラリとして使用されます.例は次のとおりです.
$ python3 blog.py # main으로 실행
import blog # 라이브러리로 실행

計算パッケージの作成


パスに関連するエラーが発生した場合、calculator packageを作成し、変更して完了します.
まず、現在のファイルの場所を以下に示します.
my appディレクトリ(写真では省略)のcalculatorディレクトリとmain.pyは位置します.

ファイルの構造は次のとおりです.
(1) main.py
# absoulte path
#from calculator.add_and_multiply import add_and_multiply 


# relative path
from .calculator.add_and_multiply import add_and_multiply


if __name__ == '__main__':
    print(add_and_multiply(1,2))
(2) add_and_multiply.py
from .multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)
(3) multiplation.py
def multiply(a,b):
    return(a*b)
今はmainpyを実行して出力します.
(base) ➜  my_app python3 main.py
Traceback (most recent call last):
  File "main.py", line 6, in <module>
    from .calculator.add_and_multiply import add_and_multiply
ImportError: attempted relative import with no known parent package
パスはImportErrorでエラーが発生しました.メインモジュールで相対パスを使用すると、Pythonはメインモジュールの場所が見つかりません.
すなわち、メインモジュールは、与えられたモジュール名が何であるかにかかわらず、常に__main__の名前に解析されるため、interpreterを使用してモジュール名にナビゲートできないため、開始位置を推定することができない.したがって、プライマリ・モジュールがディレクトリ・ロケーション・ベースの相対パスを使用している場合は、開始位置が分からないためインポートできません.
したがって、マスターモジュールでは絶対パスを使用する必要があります.
main.pyのインポートパスを絶対パスに変更します.
# absoulte path
from calculator.add_and_multiply import add_and_multiply 

if __name__ == '__main__':
    print(add_and_multiply(1,2))
main.pyのパスを絶対パスに変更するだけで、必要な結果値を出力できます.
(base) ➜  my_app python3 main.py
5

main module以外のファイルのパスは?


add_and_multiply.pyのインポートパスは相対パスです.それらは修正する必要がなくてもよく出力できます.main.pyでは,マスタモジュールの位置を絶対経路でinterpreterに確認することが可能である.相対パスを使うときは必ず基準を守ってください!はっきりさせなければならない.
相対パスを絶対パスに変換しても出力は良好です.

__init__.py


電卓バッグには__init__.pyファイルが入っています.
このファイルの役割は、ディレクトリがパッケージであることを通知することです.(※python 3.3バージョンから__init__.pyファイルがなくてもパッケージとして扱います(PEP 420).ただし、サブバージョン互換性のために__init__.pyファイルを生成することは安全な方法です.)
また、Pythonは、__init__.pyでパッケージの初期設定を行うことができる.関連事項は以下の通りである.
(1)インポート時のパスの全長を減らす
まず、__init__.pyファイルにインポートするパッケージまたはモジュールをインポートし、次のファイルからパスで作成します.非常に簡単です.
(2)packageからインポートできる変数/関数/クラスの制限
パッケージ内でのみ使用される関数がある場合は、__all__変数でインポート可能な要素を指定できます.(__all__変数はstring付きlistで、デフォルトはすべての関数/変数/クラスです.)
(3)他のパケットのインポート時に最初に実行しなければならないコード.
リファレンス
https://wikidocs.net/1418#9595init9595py