본문 바로가기
공부/Python

[python] pyinstaller 와 빌드 후 ini 환경변수 읽기(konfig)

by 병진들 2021. 6. 19.

INI(INIialization) 파일

환경변수파일을 읽고 사용하는 방법

 

pyinstaller로 python파일을 빌드 한 후에 환경설정(IP 주소라던지, PORT 라던지..)을 바꿔야 하는 경우가 있다.

 

내 경우에는 FastAPI 서버를 배포하는데, SERVER의 주소와 DB의 주소가 계속 바꾸면서 QA가 테스트해야 했기 때문에 매번 환경변수를 바꿔가며 빌드하는건 좋은방법이 아니라 생각했다.

 

그래서 환경변수파일을 따로 빼서 읽는 방법을 선택했고 찾아보니 konfig 라는 라이브러리가 있었다.

 

설치

pip install konfig

 

사용방법 (1 / 2). 먼저 import 하기

사람마다 환경이 다르겠지만,  BASE_DIR 를 지정해주는 이유나 .spec파일에 대한 설명은 아래 포스팅을 참조하면 좋을 것 같다.

https://bslife.tistory.com/76

# 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를 묶어주는 작업이 필요하다.

main.spec

 

conf.ini 파일 내부

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)

 

질문 받습니다..!

댓글