INI(INIialization) 파일
환경변수파일을 읽고 사용하는 방법
pyinstaller로 python파일을 빌드 한 후에 환경설정(IP 주소라던지, PORT 라던지..)을 바꿔야 하는 경우가 있다.
내 경우에는 FastAPI 서버를 배포하는데, SERVER의 주소와 DB의 주소가 계속 바꾸면서 QA가 테스트해야 했기 때문에 매번 환경변수를 바꿔가며 빌드하는건 좋은방법이 아니라 생각했다.
그래서 환경변수파일을 따로 빼서 읽는 방법을 선택했고 찾아보니 konfig 라는 라이브러리가 있었다.
설치
pip install konfig
사용방법 (1 / 2). 먼저 import 하기
사람마다 환경이 다르겠지만, BASE_DIR 를 지정해주는 이유나 .spec파일에 대한 설명은 아래 포스팅을 참조하면 좋을 것 같다.
# const.py
from konfig import Config
# BASE_DIR 설정 (환경마다 다름)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
_CONFIG_PATH = f'{BASE_DIR}/common/conf.ini'
c = Config(_CONFIG_PATH)
디렉토리 및 파일 구조
이해를 위한 디렉토리 및 파일 구조이다.
-- main.py
-- main.spec
-- dic.txt
-- conf.ini
-- common(dir)
---- const.py
pyinstaller를 이용하여 빌드하기 전에 main.spec에서 빌드 후 ini 파일을 제대로 읽을 수 있도록 datas를 묶어주는 작업이 필요하다.
conf.ini 파일 내부
사용방법 (2 / 2). 이어서
uvicorn으로 HOST와 PORT를 지정해서 FastAPI Server를 열어 주고,
DB정보가 바뀔 수 있기 때문에 위와 같은 환경변수들을 변경할 수 있게 했다.
같은 방법으로 서버가 파일을 업로드 받을때 path를 지정해 줄 수도 있다.
conf.ini 파일 내부를 읽는 방법은 get_map(name) 이다.
get_map의 결과값의 타입은 python의 dictionary인데, 만약 값이 여러개라면 list 타입으로 들어온다.
# const.py
# Server Setting
app = c.get_map("server") # type(app) = dict
APP_HOST_ADD=app['HOST']
APP_PORT=app['PORT']
# DB Setting
db = c.get_map("db") # type(db) = dict
DB_USER = db['USER']
DB_PW = db['PW']
DB_ADD = db['ADD']
DB_PORT = db['PORT']
DB_NAME = db['NAME']
const.py 에서 저렇게 정의 해준 뒤, main.py로 돌아와서 환경변수들을 import 해주면 끝난다.
이제 pyinstaller로 빌드 후에도 환경변수를 바꿔가며 사용할 수 있다!
# main.py
from common.consts import APP_HOST_ADD, APP_PORT
def serve():
uvicorn.run(app, host=APP_HOST_ADD, port=APP_PORT)
질문 받습니다..!
'공부 > Python' 카테고리의 다른 글
[python] pyinstaller centOS에서 빌드하기(docker) (0) | 2021.06.25 |
---|---|
[python] pyinstaller jinja2.PackageLoader Error (0) | 2021.06.24 |
[python] pyinstaller 일곱번의 삽질 for uvicorn + FastAPI (1) | 2021.06.18 |
[python] 클래스를 함수처럼 사용할수 있게.. __call__함수 (0) | 2021.06.15 |
[Python] @Decorator 파이썬 @데코레이터 (2) | 2021.06.11 |
댓글