# 키등록
% export OPENAI_API_KEY="sk-mX9fc .... "
# 등록한 키를 확인
% echo $OPENAI_API_KEY
# env 설정 정보 확인
% env | grep OPENAI_API_KEY
# env에서 제거하는 방법
% unset OPENAI_API_KEY
2. .env 파일로 관리
- 실행할 프로젝트의 root에 .env 파일을 만드고 아래와 같이 키를 입력
OPENAI_API_KEY="sk-mX9fc .... "
코드에서 .env 파일정보를 읽어오기
import os
from dotenv import load_dotenv, find_dotenv
# .env 파일을 찾기
print(find_dotenv())
> /Users/dongsik/workspace/OpenAI/langchain-kr/.env
# 찾은 .env 파일을 load
print(load_dotenv(find_dotenv()))
> True
# OPENAI_API_KEY를 출력
print(os.environ['OPENAI_API_KEY'])
> sk-mX9fc ...
logging 모듈을 사용하여 로그를 파일과 콘솔에 동시에 출력하는 방법은 다음과 같습니다:
먼저, logging 모듈을 임포트합니다
import logging
로깅을 설정합니다. 이는 로그 파일의 경로, 로그 레벨, 출력 형식 등을 지정하는 것입니다. 예를 들어, 다음과 같이 설정할 수 있습니다
# 기본 로거 생성
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# 파일 핸들러 추가 (파일로 로그를 기록)
file_handler = logging.FileHandler('example.log')
file_handler.setLevel(logging.DEBUG)
# 콘솔 핸들러 추가 (콘솔에 로그를 출력)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 로그 포맷 설정
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# 핸들러 추가
logger.addHandler(file_handler)
logger.addHandler(console_handler)
이제 로그 메시지를 출력할 수 있습니다. 예를 들어
logger.debug('이것은 디버그 메시지입니다.')
logger.info('이것은 정보 메시지입니다.')
logger.warning('이것은 경고 메시지입니다.')
logger.error('이것은 에러 메시지입니다.')
logger.critical('이것은 심각한 에러 메시지입니다.')
위 코드에서는 기본 로거를 생성하고, 파일 핸들러와 콘솔 핸들러를 추가하여 로그를 파일과 콘솔에 동시에 출력합니다. 로그 포맷과 로그 레벨은 각 핸들러에서 설정됩니다.
이렇게 하면 로그가 파일과 콘솔에 동시에 출력되어 프로그램의 디버깅 및 모니터링에 도움이 됩니다.
3. 로깅을 설정하는 별도의 모듈을 만들고 전체 프로젝트에서 사용하는 방법
모든 파이썬 파일에 로깅 파일 핸들러와 콘솔 핸들러를 적용하는 가장 효과적인 방법은 로깅을 설정하는 별도의 모듈을 만들고, 이를 모든 파이썬 파일에서 임포트하여 사용하는 것입니다. 이를 위해서는 다음과 같은 단계를 따릅니다:
로깅 설정을 포함하는 logger.py와 같은 파일을 생성합니다
import logging
# 기본 로거 생성
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# 파일 핸들러 추가 (파일로 로그를 기록)
file_handler = logging.FileHandler('example.log')
file_handler.setLevel(logging.DEBUG)
# 콘솔 핸들러 추가 (콘솔에 로그를 출력)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 로그 포맷 설정
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# 핸들러 추가
logger.addHandler(file_handler)
logger.addHandler(console_handler)
이제 logger.py를 프로젝트의 다른 모든 파이썬 파일에서 임포트하여 사용합니다. 예를 들어, 다른 파이썬 파일에서 로깅을 사용할 때 다음과 같이 logger.py를 임포트합니다
from logger import logger
# 로그 메시지 출력
logger.debug('이것은 디버그 메시지입니다.')
logger.info('이것은 정보 메시지입니다.')
logger.warning('이것은 경고 메시지입니다.')
logger.error('이것은 에러 메시지입니다.')
logger.critical('이것은 심각한 에러 메시지입니다.')
이렇게 하면 모든 파이썬 파일에서 같은 로깅 설정을 사용할 수 있으며, 코드의 중복을 피할 수 있습니다. 또한 로깅 설정을 한 곳에서 관리하기 때문에 유지보수가 용이해집니다.
logger LEVEL을 외부에서 바꾸기
로그 레벨을 외부에서 변경할 수 있도록 하려면 로깅 설정을 변경할 수 있는 함수를 만들어야 합니다. 이 함수를 호출하여 로그 레벨을 변경할 수 있습니다. 예를 들어, 다음과 같이 코드를 작성할 수 있습니다.
logger.py
import logging
# 기본 로거 생성
logger = logging.getLogger()
# 파일 핸들러 추가 (파일로 로그를 기록)
file_handler = logging.FileHandler('example.log')
file_handler.setLevel(logging.DEBUG)
# 콘솔 핸들러 추가 (콘솔에 로그를 출력)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 로그 포맷 설정
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# 핸들러 추가
logger.addHandler(file_handler)
logger.addHandler(console_handler)
def set_log_level(level):
logger.setLevel(level)
file_handler.setLevel(level)
console_handler.setLevel(level)
이제 set_log_level() 함수를 사용하여 로그 레벨을 변경할 수 있습니다. 예를 들어, 다음과 같이 호출할 수 있습니다.
import logging
from logger import set_log_level, logger
# 로그 레벨을 변경합니다.
set_log_level(logging.INFO)
# 로그 메시지 출력
logger.debug('디버그 메시지는 출력되지 않습니다.')
logger.info('이것은 정보 메시지입니다.')
위 코드에서는 로그 레벨을 INFO로 설정하고 있으므로 DEBUG 레벨의 로그는 출력되지 않습니다. set_log_level 함수를 호출하여 로그 레벨을 변경하면 로그 레벨이 변경됩니다.
$ pip install streamlit
Defaulting to user installation because normal site-packages is not writeable
Collecting streamlit
Downloading streamlit-1.10.0-py2.py3-none-any.whl (9.1 MB)
|████████████████████████████████| 9.1 MB 24.5 MB/s
... <생략>
Successfully installed altair-4.1.0 blinker-1.5 commonmark-0.9.1 gitdb-4.0.9 \
gitpython-3.1.18 pyarrow-6.0.1 pydeck-0.6.2 pympler-1.0.1 rich-12.6.0 semver-2.13.0 \
smmap-5.0.0 streamlit-1.10.0 toolz-0.12.0 validators-0.20.0 watchdog-2.3.1
2. Streamlit 데모 실행하기
Streamlit이 성공적으로 설치되었다면, Streamlit의 데모를 실행해 볼 수 있습니다. 이는 Streamlit이 제대로 설치되었는지 확인하는 데에도 도움이 됩니다. 다음 명령어를 통해 Streamlit의 Hello World 데모를 실행할 수 있습니다.
$ streamlit hello
Welcome to Streamlit. Check out our demo in your browser.
Network URL: http://<Private IP>:8501
Ready to create your own Python apps super quickly?
Head over to https://docs.streamlit.io
May you create awesome apps!
이 명령어를 실행하면, 기본 웹 브라우저가 자동으로 열리고 Streamlit의 환영 메시지가 담긴 페이지로 이동합니다. 이 페이지에서는 Streamlit의 다양한 기능을 소개하는 예제들을 확인하고 직접 실행해 볼 수 있습니다.
3. 자신만의 Streamlit 앱 만들기
Streamlit으로 자신만의 앱을 만들기 위해서는 간단한 Python 스크립트를 작성해야 합니다. 예를 들어, 다음과 같은 코드를 app.py라는 파일에 작성해 보세요.
import streamlit as st
st.title('나의 첫 Streamlit 앱')
st.write('Streamlit은 정말 멋져요!')
그리고 나서, 터미널에서 다음과 같이 이 스크립트를 실행합니다.
$ streamlit run app.py
2024-03-13 14:08:43.872 Did not auto detect external IP.
Please go to https://docs.streamlit.io/ for debugging hints.
You can now view your Streamlit app in your browser.
Network URL: http://<Private IP>:8501
이 명령어를 실행하면, 웹 브라우저가 열리고 당신이 작성한 Streamlit 앱을 볼 수 있습니다. 이제부터는 원하는 대로 코드를 수정하고, 데이터를 시각화하고, 사용자 입력을 받는 등 다양한 기능을 추가하여 앱을 개발할 수 있습니다.
마무리
Streamlit을 사용하면 복잡한 웹 프레임워크 없이도 Python만으로 데이터 애플리케이션을 빠르게 구축할 수 있습니다. 이제 기본적인 설치와 데모 실행 방법을 알게 되었으니, 다양한 프로젝트에 활용해 보겠습니다.
그러나 svn import는 이미 존재하는 디렉토리나 파일을 추가하는 것을 허용하지 않습니다. 따라서 "강제로" 추가하는 것은 기본 기능이 아니며, 일반적으로 필요하지 않습니다.
만약 이미 존재하는 디렉토리나 파일을 추가해야 하는 상황이라면, 먼저 해당 디렉토리나 파일을 삭제한 후 다시 svn add 명령어를 사용하여 추가해야 합니다. 이렇게 하면 SVN에서 강제로 추가하는 것이 아니라 일반적인 방법으로 파일이나 디렉토리를 추가할 수 있습니다.
$ svn help import
import: Commit an unversioned file or tree into the repository.
usage: import [PATH] URL
Recursively commit a copy of PATH to URL.
If PATH is omitted '.' is assumed.
Parent directories are created as necessary in the repository.
If PATH is a directory, the contents of the directory are added
directly under URL.
Unversionable items such as device files and pipes are ignored
if --force is specified.
Valid options:
-q [--quiet] : print nothing, or only summary information
-N [--non-recursive] : obsolete; try --depth=files or --depth=immediates
--depth ARG : limit operation by depth ARG ('empty', 'files',
'immediates', or 'infinity')
--auto-props : enable automatic properties
--force : force operation to run
--no-auto-props : disable automatic properties
-m [--message] ARG : specify log message ARG
-F [--file] ARG : read log message from file ARG
--force-log : force validity of log message source
--editor-cmd ARG : use ARG as external editor
--encoding ARG : treat value as being in charset encoding ARG
--with-revprop ARG : set revision property ARG in new revision
using the name[=value] format
--no-ignore : disregard default and svn:ignore property ignores
Global options:
--username ARG : specify a username ARG
--password ARG : specify a password ARG
--no-auth-cache : do not cache authentication tokens
--non-interactive : do no interactive prompting
--trust-server-cert : accept SSL server certificates from unknown
certificate authorities without prompting (but only
with '--non-interactive')
--config-dir ARG : read user configuration files from directory ARG
--config-option ARG : set user configuration option in the format:
FILE:SECTION:OPTION=[VALUE]
For example:
servers:global:http-library=serf
$