개요
파이썬은 같은 디렉토리 내의 .py 파일들을 각각 하나의 모듈로 보기 때문에 다른 파이썬 파일의 함수나 클래스를 참조하기 위해서는 import를 해주어야 한다.
자주 사용되는 모듈들은 Python 설치 시 기본적으로 PATH 환경변수에 모듈이 저장된 디렉토리가 포함되어 별도 경로 지정 없이도 참조가 가능하지만 직접 구현한 모듈의 경우에는 import 시 경로 지정이 필요하다.
기본적으로 지정된 모듈의 경로를 확인하려면 아래와 같이 파이썬 코드를 실행해본다.
import sys
print(sys.path)
모듈 사용 방법
현 프로젝트에서는 API 호출 시 별도 HTTP util을 사용하여 get 또는 post 요청을 하도록 구현을 하였다. 아래와 같이 HTTPUtil 클래스를 http_util.py 파일에 작성하였다면
import json
import requests
class HTTPUtil:
def __init__(self):
print('')
@staticmethod
def get(url, params, headers):
resp = requests.get(url=url, params=params, headers=headers)
resp_json = json.loads(resp.text)
print(json.dumps(resp_json, indent=4, sort_keys=True, ensure_ascii=False))
return resp_json
@staticmethod
def post(url, data):
resp = requests.post(url=url, data=json.dumps(data), headers={'Content-Type': 'application/json'})
resp_json = json.loads(resp.text)
print(json.dumps(resp_json, indent=4, sort_keys=True, ensure_ascii=False))
return resp_json
위 모듈을 참조하는 naver_api.py 파일에서는 아래와 같이 import 문을 작성해야한다.
import http_util
class SampleAPI:
def __init__(self):
http_util.HTTPUtil.get()
... 생략 ...
import 문에 들어가는 http_util은 같은 디렉토리 내 http_util.py 파일을 의미한다. import가 정상적으로 된 경우 http_util 파일의 HTTPUtil 클래스를 참조하기 위해서는 http_util.HTTPUtil.get()과 같이 호출을 해야 한다. 이 경우 모듈명이 앞에 항상 붙기 때문에 코드가 장황해지는 단점이 있다. 모듈 안의 클래스나 함수를 직접적으로 접근하기 위해서는 아래와 같이 import 구문을 사용할 수도 있다.
from http_util import *
class SampleAPI:
def __init__(self):
HTTPUtil.get()
... 생략 ...
하지만 위와 같이 사용할 경우 참조하는 모듈이 여러개일 때 모듈 내 함수나 클래스명이 중복되면 안된다. 여러 모듈을 import해서 사용하는 경우에는 모듈명을 명시하는 것이 더 명확한 방법이다.
참고
하나의 파이썬 스크립트를 여러개의 모듈로 분리할 경우 각 모듈에서 테스트를 위해 아래와 같이 실행 코드를 삽입하는 경우가 있다.
import configparser
import sample_api
class Sample:
... 생략 ...
Sample() # 실행 코드
위 예제에서는 CollectBot() 부분이 실행 코드가 되는데 다른 모듈에서 위 모듈을 import하는 경우 다른 모듈의 스크립트를 실행하더라도 CollectBot() 코드가 실행이 된다.
다른 언어들 처럼 main 함수를 구현하여 실행 진입점을 명확하게 지정하는 것과 달리 파이썬은 실행 대상의 .py 파일이 실행 진입점이 되기 때문에 발생하는 문제라고 볼 수 있다.
그래서 파이썬에서는 실행되는 모듈이 자신이 실행 진입점인지를 판단 할 수 있도록 글로벌 변수인 main를 제공한다. main 변수에는 실행된 모듈의 이름이 들어가 있다. 그러므로 해당 모듈을 실행했을 때만 코드를 실행하게 하려면 아래와 같이 코드를 구현한다.
import configparser
import sample_api
class Sample:
... 생략 ...
if __name__ == '__main__':
Sample()
'Work > 개발 노트' 카테고리의 다른 글
[WEB] 토큰 기반 인증 (2) | 2020.09.04 |
---|---|
[LDAP] 개념 잡기 (3) | 2020.09.04 |
Go언어로 웹 서버 개발 시 Swagger 문서 자동 생성하기 (0) | 2020.05.05 |
Mac에서 VS Code 터미널 폰트 깨지는 문제 (3) | 2019.06.23 |
AWS 자격증 시험 - 클라우드 종사자(Cloud Practitioner) 후기 (23) | 2019.06.17 |
댓글