10분이면 파이썬의 import을 알 수 있어요.

6110 단어 Python3ipy

import 이후에 무슨 일이 일어났습니까?


알 듯 모를 듯하다.
쓸 수 있는데 잘 모르겠어요.
그런 import에 무슨 일이 일어났는지 조사해 봤어요.

작업 환경(버전)


ipython : 6.2.1
python: Python 3.6.4::Anaconda, Inc.
현재 디렉토리에 다음 파일이 있습니다.
hoge.py

def hoge():
    print("ほげメソッド!")

print("ほげぇ!")
fuga.py

def fuga():
    print("ふがメソッド!")

if __name__ == '__main__':
    print("ふがぁ!")

뭐 하세요?


말하자면import hoge 도대체 뭐하는 거야.단지 py를 실행하고 있을 뿐입니다.
  • # 이하는 설명 주석이며 실제로 표시되지 않습니다.*
  • In [1]: import hoge
    ほげぇ! # hoge.pyファイルを実行するのでprint("ほげぇ!")が実行される
    
    In [2]: hoge.hoge()
    ほげメソッド! # 定義されたメソッドはhoge.メソッド名で実行できる。
    
    In [9]: type(hoge)
    Out[9]: module # hogeさんはメソッドクラス
    
    
    아니에요.hoge.py를 읽고 메모리로 펼치기, hoge.xxx() 형식의 hoge.py에 기술된 변수와 방법에 접근할 수 있을 뿐입니다.

    csv와 Requests 같은 파일은?했던 거 기억 안 나?


    csv 등 표준 모듈은python을 설치한 디렉터리 근처에 있습니다.구체적으로 import module 이후module.__file__에는 절대 경로를 알 수 있다.
    In [11]: import csv
    
    In [12]: csv.__file__
    Out[12]: '/Users/user/.pyenv/versions/anaconda3-5.1.0/lib/python3.6/csv.py'
    
    출력된 파일을 열면python으로 기술된 것을 분명히 알 수 있습니다.
    In [15]: import numpy
    
    In [16]: numpy.__file__
    Out[16]: '/Users/user/.pyenv/versions/anaconda3-5.1.0/lib/python3.6/site-packages/numpy/__init__.py'
    
    또한 외부 모듈에서 많이 읽는 파일은 init입니다.때로py가 될 수도 있어.
    이런 상황에서 __init__.py를 보면 그 디렉터리에 모듈군의py 파일이 있고 이를 import로 되어 있음을 알 수 있다.모두 하나씩 만들어내는 것은 어렵기 때문에 함께 할 수 있다는 것이다.

    import 파일을 어떻게 찾습니까?

    sys.path에 설명된 위치를 찾습니다.
    기본적
  • 현재 디렉토리
  • 표준 모듈의 배치 장소
  • pip install의 저장 위치
  • 아무 작업도 하지 않고도 읽을 디렉토리입니다.
    In [19]: import sys
    
    In [20]: sys.path
    Out[20]: 
    ['',
     '/Users/user/.pyenv/versions/anaconda3-5.1.0/bin',
     '/Users/user/.pyenv/versions/anaconda3-5.1.0/lib/python36.zip',
     '/Users/user/.pyenv/versions/anaconda3-5.1.0/lib/python3.6',
     '/Users/user/.pyenv/versions/anaconda3-5.1.0/lib/python3.6/lib-dynload',
     '/Users/user/.pyenv/versions/anaconda3-5.1.0/lib/python3.6/site-packages',
     '/Users/user/.pyenv/versions/anaconda3-5.1.0/lib/python3.6/site-packages/aeosa',
     '/Users/user/.pyenv/versions/anaconda3-5.1.0/lib/python3.6/site-packages/IPython/extensions',
     '/Users/user/.ipython']
    
    다른 디렉터리를 읽기 대상으로 삼으려면bash_프로필 등export PYTHONPATH="${PYTHONPATH}:/読み込みたいディレクトリのフルパス/"를 입력합니다.

    "main"은 무엇입니까?


    이 파일을 실행할 때만 실행되는 블록입니다.
    먼저 종착역에 있습니다.py를 실행해 보세요.
    python $python fuga.py
    ふがぁ
    
    다음은 ipython으로fuga를 가져와 봅시다.
    In [1]: import fuga
    # 何も表示されない
    
    이렇게 파일을 직접 실행할 때 실행
    가져올 때 실행하지 않습니다.
    왜 이렇게 써요?
    예를 들어 터틀 모듈은 이 블록if __name__ == "__main__":에 설명되어 있고python 터틀이 있습니다.피라면 거북이 선생은 정신이 맑아서 걷기 시작한다.

    그저 시위 행진import turtle에 쓰일 뿐이라고 할 때는 실행하지 않는다.
    하지만 거북이가 아무리 귀여워도 움직일 때마다 짜증나죠.
    이렇게 모듈로 읽을 때는 집행을 원하지 않는 시위 행진과 테스트 등 처리를 적는 기법을 쓴다.

    if __name__ == "__main__": 목적은 알겠는데, 이런 징그러운 글씨는 무엇입니까?

    __name__ 등 좀 눈에 거슬리는 것은 if문일 뿐이다."__main__" 보시다시피 문자열은 입문서상에서 자주 볼 수 있습니다.if student == "Ken":와 같습니다.
    예?선언했던 거 기억 안 나?
    직접 실행 시 "main"입장__name__import을 진행했을 때__name__ 등의 파일 이름이 들어왔다.
    이 동작을 확인하기 위해 다음 파일을 만들어 보세요.
    tasu.py
    def tasu(a, b):
        print("method call" + __name__)
        return a + b
    
    
    if __name__=='__main__':
        print(__name__)
        print("4 + 6 = " + str(tasu(4, 6)))
    
    실행 결과
    python tasu.py 
    __main__
    method call__main__
    4 + 6 = 10
    
    이렇게 직접 집행하면hoge에는__name__가 있다.
    다음은 ipython으로 실행해 봅시다.
    In [1]: import tasu
    
    In [2]: tasu.tasu(5, 8)
    method calltasu
    Out[2]: 13
    
    import__main__만 있으면 블록을 실행하지 않습니다.
    방법 내 print if __name__ == "__main__" 를 다시 호출하면 __name__ 파일 이름이 표시됩니다.

    총결산

  • import hoge는 hoge입니다.py 파일만 실행했습니다.
  • import에서 찾을 디렉터리의 위치tasu를 확인하고 변경할 수 있습니다.
  • sys.path 파일을 직접 실행할 때 실행하고 프레젠테이션과 테스트를 작성합니다.
  • 이런 느낌이에요.
    실제 파일에 써서 실행하고 ipythonif __name__ == '__main__':에 한번 쳐보면 이해가 늘어납니다.

    좋은 웹페이지 즐겨찾기