poetry show
poetry show --tree # 의존성 트리
poetry show --latest # 최신 버전도 함께 표시
poetry show --outdated # 업데이트가 가능한 패키지의 목록 표시
poetry show --no-dev # 개발 의존성을 제외하고 표시
4️⃣ 가상환경 생성 및 활성화
poetry env activate
Poetry 2.0 업데이트에 따른 주요 변경사항
poetry export:
Poetry 1.2 버전부터 poetry export 명령은 이제 기본 기능이 아니라 플러그인으로 제공됩니다.
poetry export를 사용하려면 poetry-plugin-export 플러그인을 별도로 설치해야 합니다.
poetry shell:
poetry shell 명령어도 더 이상 Poetry의 기본 명령어로 제공되지 않습니다.
새로운 명령어인 poetry env activate를 사용하여 가상환경 활성화를 해야합니다.
poetry shell 명령어를 사용하고 싶다면, poetry-plugin-shell 플러그인을 설치하여 사용할 수 있습니다.
Python 애플리케이션을 개발할 때, 환경 변수를 사용하는 것은 매우 중요한 부분입니다. API 키, 데이터베이스 접속 정보와 같은 민감한 데이터를 코드에 직접 코딩하지 않고 환경 변수로 관리하는 것이 좋습니다. 이번 블로그에서는 python-dotenv 라이브러리를 사용하여 Python 환경 변수를 관리하는 방법에 대해 알아보겠습니다.
1. Python Dotenv 설치하기
먼저, python-dotenv 라이브러리를 설치 합니다. 이 라이브러리는 .env 파일에 저장된 환경 변수를 읽어 Python 애플리케이션에서 사용할 수 있도록 해줍니다.
# pipenv
pipenv install python-dotenv
2. .env 파일 생성하기
프로젝트 루트 디렉토리에 .env 파일을 생성합니다. 이 파일에는 환경 변수와 그 값을 키=값 형식으로 작성합니다. .env 파일에는 민감한 정보가 포함될 수 있으므로, .gitignore 파일을 생성하고 .env 파일을 추가하여 github 등에 포함되지 않도록 하여 줍니다.
이제 Python 코드에서 python-dotenv을 사용하여 .env 파일에 정의된 환경 변수를 로드할 수 있습니다. 이를 위해 dotenv 모듈의 load_dotenv 함수를 사용합니다.
import os
from dotenv import load_dotenv
# Load environment variables from the .env file (if present)
load_dotenv()
# Access environment variables as if they came from the actual environment
SECRET_KEY = os.getenv('SECRET_KEY')
DATABASE_URL = os.getenv('DATABASE_URL')
API_KEY = os.getenv('API_KEY')
# Example usage
print(f'SECRET_KEY: {SECRET_KEY}')
print(f'DATABASE_URL: {DATABASE_URL}')
print(f'API_KEY: {API_KEY}')
python-dotenv 라이브러리를 사용하면 환경 변수를 쉽게 관리하고 애플리케이션 설정을 안전하게 유지할 수 있습니다. 이 방법을 통해 코드 내에 민감한 정보를 반영 하지 않고, 다양한 환경에서 동일한 코드를 사용할 수 있습니다. python-dotenv을 사용하여 환경 변수를 효율적으로 관리해보시기 바랍니다.
# Base 이미지
FROM python:3.12-slim
# 2. 작업 디렉토리를 /app으로 설정
WORKDIR /app
# 3. 현재 디렉토리의 requirements.txt 파일을 컨테이너의 /app으로 복사
COPY requirements.txt /app/
# 4. requirements.txt에 명시된 패키지 설치
RUN pip3 install -r requirements.txt
# 5. 실행할 streamlit_app.py를 컨테이너 /app으로 복사
COPY streamlit_app.py /app/
# 6. 컨테이너가 수신할 포트 오픈
EXPOSE 8501
# 7. 컨테이너 헬스 체크
HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
#8. 실행될 컨테이너 구성
ENTRYPOINT [ "streamlit", "run", "streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0" ]
Streamlit 버전 1.10.0 이상에서는 Streamlit 앱을 Linux 배포판의 루트 디렉터리에서 실행할 수 없습니다. 따라서 WORKDIR은 루트가 아닌 별도 디렉토리를지정해야 합니다. (예. /app) (참고) github Issue:5239
Docker image 빌드
생성한 Dockerfile 을 streamlit 이미지 이름으로 빌드합니다.
docker build -t streamlit .
docker images 로 생성된 이미지 를 확인합니다.
REPOSITORY TAG IMAGE ID CREATED SIZE
streamlit latest bb9ac485406e 2 minutes ago 634MB
Docker 컨테이너 실행
컨테이너의 포트 8501을 서버의 8501 포트에 게시합니다.
docker run -p 8501:8501 streamlit
출력된 URL로 접속합니다.
Collecting usage statistics. To deactivate, set browser.gatherUsageStats to False.
You can now view your Streamlit app in your browser.
URL: http://0.0.0.0:8501
Streamlit은 데이터 애플리케이션을 빠르고 쉽게 만들 수 있도록 설계된 파이썬 기반의 오픈 소스 라이브러리입니다. 이 도구는 데이터 시각화와 머신 러닝 모델의 프로토타이핑 및 배포를 단순화하여 사용자가 복잡한 데이터 작업을 쉽게 수행할 수 있게 합니다.
Streamlit의 특징
코드 중심의 접근 방식: Streamlit 애플리케이션은 순수 파이썬 코드로 작성되므로 별도의 웹 프론트엔드 기술 없이도 데이터 앱을 만들 수 있습니다.
간편한 사용법: 몇 줄의 코드만으로도 인터랙티브한 요소(슬라이더, 버튼, 차트 등)를 추가할 수 있으며, 앱의 업데이트와 실행이 매우 빠릅니다.
빠른 프로토타이핑: 데이터 과학 프로젝트의 초기 아이디어를 빠르게 시각화하고 공유할 수 있어 프로토타이핑과 반복 개발 과정이 용이합니다.
확장성: Streamlit 앱은 컨테이너화하여 쉽게 배포할 수 있고, 다양한 데이터 소스와 라이브러리를 지원합니다.
장점
빠른 개발 속도: 복잡한 웹 앱을 빠르게 개발할 수 있으며, 데이터 과학자가 웹 개발에 대한 깊은 지식 없이도 사용할 수 있습니다.
쉬운 배포: Streamlit Sharing을 통해 GitHub에서 직접 앱을 호스팅하고 공유할 수 있습니다.
강력한 커뮤니티 지원: 오픈 소스 프로젝트로서 활발한 커뮤니티 지원과 지속적인 업데이트가 이루어집니다.
인터랙티비티: 사용자 입력에 반응하는 동적인 데이터 애플리케이션을 쉽게 만들 수 있습니다.
단점
고급 사용자 정의 제한: Streamlit은 사용의 용이성에 중점을 두기 때문에, 복잡한 사용자 인터페이스나 고도로 맞춤화된 앱 디자인을 구현하기 어려울 수 있습니다.
성능 문제: 대규모 데이터셋이나 복잡한 연산을 처리하는 앱의 경우, 성능 저하가 발생할 수 있습니다.
웹 개발 기능의 제한: 전통적인 웹 개발 툴셋에 비해 제공하는 웹 개발 기능이 제한적일 수 있습니다. 복잡한 웹 애플리케이션을 구축하려는 경우 다른 프레임워크를 고려해야 할 수도 있습니다.
Streamlit App 실행하기
# streamlit 라이브러리설치
pip install streamlit
# Streamlit으로 실행
streamlit run your_script.py
# Python 모듈로 실행 → Python으로 실행하는 경우, PyCharm과 같은 IDE를 구성할 때 유용할 수 있습니다.
python -m streamlit run your_script.py
Data 표시방법
Streamlit에서 Data (tables, arrays, data frames 등)를 표시하는 방법은 magic CLI 와 st.write() 를 활용하는 방법이 있다. st.write()는 텍스트에서 테이블까지 다 작성이 가능하다.
① magic command line
Streamlit은 변수나 데이터가 선언되어 있으면 자동으로 st.write()를 사용하여 앱을 빌드 합니다.
###
# first app
# DataFrame 으로 테이블을 생성
###
import streamlit as st
import pandas as pd
df = pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20,30, 40]
})
df
② st.write()
st.write()는 텍스트, 데이터, 차트 등 arguments 에 따라 작성 할 수 있다.
import streamlit as st
import pandas as pd
st.write("Here's our first attempt at using data to create a table:")
st.write(pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20,30, 40]
}))
데이터를 표시하는 데 사용할 수 있는 st.dataframe() 및 st.table()과 같은 함수를 사용하여 다양한 style을 적용 할 수 있다.
DataFrame에 Style 적용하기
① DataFrame에 Highligt 적용
import streamlit as st
import pandas as pd
import numpy as np
df = pd.DataFrame(
np.random.randn(10, 20), # 표준 정규분포 확률을 따르는 난수를 생성
columns = ('col %d' % i for i in range(20))
)
# 열의 최대값에 하이라이트 표시
st.dataframe(df.style.highlight_max(axis=0))
import streamlit as st
import pandas as pd
import numpy as np
df = pd.DataFrame(
np.random.randn(10, 20), # 표준 정규분포 확률을 따르는 난수를 생성
columns = ('col %d' % i for i in range(20))
)
st.table(df)
import streamlit as st
import pandas as pd
import numpy as np
df = pd.DataFrame(
np.random.randn(20, 3), # 표준 정규분포 확률을 따르는 난수를 생성
columns = ['a', 'b', 'c']
)
st.line_chart(df)
import streamlit as st
import pandas as pd
import numpy as np
st.markdown("### 1. slider widget")
x = st.slider('x')
st.write(x, '제곱은', x * x)
st.markdown("### 2. text input widget")
st.text_input("Your name", key="name")
# You can access the value at any point with:
st.session_state.name
st.markdown("### 3. checkbox widget")
if st.checkbox('Once you checked, dataframe is displyed'):
chart_data = pd.DataFrame(
np.random.randn(20, 3),
columns=['a', 'b', 'c'])
chart_data
st.markdown("### 4. selectbox widget")
df = pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20, 30, 40]
})
option = st.selectbox(
'Which number do you like best?',
df['first column'])
'You selected: ', option
import streamlit as st
import time
# 사이드바에 selctbox 구성하기
add_selectbox = st.sidebar.selectbox(
'How would you like to be contacted?',
('Email', 'Home phone', 'Mobile phone')
)
# 사이드바에 slide 구성하기
add_slider = st.sidebar.slider(
'Select a range of values',
0.0, 100.0, (25.0, 75.0)
)
# 위젯을 나란히 배치하기
left_column, right_column = st.columns(2)
left_column.title('Left Column')
left_column.button('Press me')
right_column.title('Right Column')
with right_column:
chosen = st.radio(
'Sorting hat',
("Gryffindor", "Ravenclaw", "Hufflepuff", "Slytherin")
)
st.write(f"You are in {chosen} house!")
# Progress Bar
st.title('Progress Bar')
'Starting a long computation...'
latest_iteration = st.empty()
bar = st.progress(0)
for i in range(100):
latest_iteration.text(f'Iteration {i+1}')
bar.progress(i+1)
time.sleep(0.1)
'...and now we\'re done!'
멀티페이지 App 만들기
Streamlit 1.10 이상 부터는 멀티 페이지를 구성할 수 있습니다.
서브페이지 구성 제약
Sub 페이지의 기본 구성은 pages 디렉토리에 위치해야 합니다.
각 Streamlit 앱의 이름은 파일 이름에 따라 결정되므로 앱 이름을 변경하려면 파일 이름을 변경해야 합니다. (이모티콘 추가도 가능)
각 Python 파일의 시작 부분에 숫자를 추가하여 페이지 순서를 지정할 수 있습니다. 파일 이름 앞에 1을 추가하면 Streamlit은 해당 파일을 목록의 첫 번째로 배치합니다.
각 페이지에는 파일 이름으로 정의된 고유한 URL이 있습니다.
멀티페이지 구성
멀티페이지는 메인이 되는 Home.py 와 내부의 1_page_one.py, 2_Page_two.py, 3_🥉_three.py 3개의 서브페이지로 이동 되도록 구성합니다.
페이스 구성 소스트리
Home.py # "streamlit run"으로 실행할 메인 파일
└─── pages/
└─── 1_page_one.py
└─── 2_Page_two.py
└─── 3_🥉_three.py
① 기본 사이드바 탐색 숨기기
파일명을 기준으로 사이드바 메뉴를 별도 이름으로 지정할 수 있도록 변경합니다. 사용자 정의 탐색 메뉴를 생성할 때 를 사용하여 기본 사이드바 탐색을 숨겨야 합니다. 소스코드 루트 .streamlit/config.toml작업 디렉터리에 다음 파일을 추가합니다 .
pdf 를 추출하기 위해 pdfplumber.open(file) 함수를 이용하여 pdf를 추출합니다.
import os
import pdfplumber
import pandas as pd
file_path = os.getcwd()+"/contents/"
pdf_name = "file.pdf"
pdf_file_path = file_path + pdf_name
# PDF 파일 열기
pdf = pdfplumber.open(pdf_file_path)
pages = pdf.pages
print("총 페이지 수 : ", len(pages))
tables = []
# 1. 페이지에서 표 데이터 추출하기
for each in pages:
table = each.extract_tables()
tables.extend(table)
3. 데이터 프레임으로 변환
# 2. 데이터 프레임으로 변환
df = pd.DataFrame(tables[1:], columns=[tables[0]])
# 3. 데이터프레임을 엑셀 파일로 저장
excel_file_path = file_path + "file.xlsx"
df.to_excel(excel_file_path, index=False, engine='openpyxl')
print(f'DataFrame이 {excel_file_path}에 저장 되었습니다.')
Anaconda 가상환경은 운영체제끼리는 같아야 yml 기반으로 가상환경 생성 과정에서 에러가 생기지 않습니다.
일부 OS 플랫폼에서는 사용할 수 없는 패키지가 있습니다.
Linux에서만 사용할 수 있는 패키지와 Windows에서만 사용할 수 있는 패키지가 있어 빌드버전은 OS에 따라 다를 수 있습니다.
Conda does not check architecture or dependencies when installing from a spec file. To ensure that the packages work correctly, make sure that the file was created from a working environment, and use it on the same architecture, operating system, and platform, such as linux-64 or osx-64.
1. 가상환경 Export
빌드 버전의 OS종속성을 제거하기 위해 --no-build 옵션을 사용하여 가상환경을 추출합니다.
Window 환경의 CMD(명령 프롬프트)에서는 conda 명령어가 잘 동작하지만 powershell에서는 명령어가 동작하지 않는 문제가 있습니다.
아래와 같이 하면 PowerShell에서도 사용할 수 있습니다.
1. init powershell in Conda
# 1. ****init powershell in Conda****
conda init powershell
# 2. 현재 설정된 정책을 확인
Get-ExecutionPolicy
# Result
PS C:\WINDOWS\system32> Get-ExecutionPolicy
ByPass
2. 실행 정책 변경
아래 명령어로 정책을 변경합니다.
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
Get-ExecutionPolicy 으로 Unrestricted 결과가 나오면 정책이 변경이 완료됩니다.