파이썬의 logging 모듈을 사용하여 로그 파일을 일자별로 생성하려면, TimedRotatingFileHandler를 사용하는 것이 좋습니다. 이 핸들러는 지정된 간격에 따라 로그 파일을 새로 만들고, 이전 로그 파일의 이름 뒤에 타임스탬프를 붙여 구분합니다. 일자별 로그 파일 생성을 위한 사용자 정의 로깅 클래스 예시는 다음과 같습니다.

 

import logging
from logging.handlers import TimedRotatingFileHandler
import os

class DailyLogger:
    def __init__(self, name, log_dir='logs', level=logging.DEBUG):
        # 로그 파일 디렉터리 확인 및 생성
        if not os.path.exists(log_dir):
            os.makedirs(log_dir)
        
        # 로그 파일 경로 설정
        log_file_path = os.path.join(log_dir, f"{name}.log")
        
        # 로거 생성 및 레벨 설정
        self.logger = logging.getLogger(name)
        self.logger.setLevel(level)
        
        # 일자별로 로그 파일을 생성하는 핸들러 설정
        file_handler = TimedRotatingFileHandler(log_file_path, when="midnight", interval=1, backupCount=7)
        file_handler.setLevel(level)
        
        # 로그 포맷 설정
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        file_handler.setFormatter(formatter)
        
        # 핸들러를 로거에 추가
        self.logger.addHandler(file_handler)
        
    def get_logger(self):
        """
        구성된 로거 객체 반환
        """
        return self.logger

 

이 클래스는 로그 파일을 매일 자정에 새로 생성하도록 설정됩니다. backupCount=7은 로그 파일을 최대 7개까지 보관하고, 이를 초과하면 가장 오래된 파일부터 삭제한다는 것을 의미합니다. 로그 디렉터리는 생성자에서 log_dir 인자를 통해 지정할 수 있으며, 기본값은 현재 작업 디렉터리 내의 logs 폴더입니다.

사용 예시는 다음과 같습니다:

# DailyLogger 인스턴스 생성 및 로거 가져오기
daily_logger = DailyLogger(name='MyDailyLogger', log_dir='my_logs', level=logging.INFO).get_logger()

# 로깅 메시지 기록
daily_logger.info('정보 메시지입니다.')

 

이 코드를 실행하면, my_logs 디렉터리 내에 MyDailyLogger.log 파일이 생성되고, 매일 자정마다 새로운 로그 파일로 전환됩니다. 파일 이름은 자동으로 날짜가 추가되어 구분됩니다.

'python > logging' 카테고리의 다른 글

Custom Logger 만들기 1  (0) 2024.03.29
logging 설정하는 방법  (0) 2024.03.14

파이썬에서 로깅(logging)은 애플리케이션의 실행 상태에 대한 정보를 기록하는 중요한 기능입니다. logging 모듈을 사용하면 콘솔, 파일, 웹 서버 등 다양한 대상에 로그를 출력할 수 있습니다. 사용자 정의 로깅 클래스를 만드는 기본적인 예시입니다.

 

먼저, 파이썬의 logging 모듈을 사용하여 로거(logger), 핸들러(handler), 포매터(formatter)를 설정하는 사용자 정의 클래스를 만듭니다. 이 클래스는 로깅을 쉽게 설정하고 사용할 수 있도록 도와줍니다.

 

import logging

class MyLogger:
    def __init__(self, name, level=logging.DEBUG, file_name='app.log'):
        # 로거 생성
        self.logger = logging.getLogger(name)
        self.logger.setLevel(level)  # 로그 레벨 설정
        
        # 파일 핸들러 생성 및 설정
        file_handler = logging.FileHandler(file_name)
        file_handler.setLevel(level)
        
        # 콘솔 핸들러 생성 및 설정
        console_handler = logging.StreamHandler()
        console_handler.setLevel(level)
        
        # 로그 포맷 설정
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        file_handler.setFormatter(formatter)
        console_handler.setFormatter(formatter)
        
        # 핸들러를 로거에 추가
        self.logger.addHandler(file_handler)
        self.logger.addHandler(console_handler)
    
    def get_logger(self):
        """
        구성된 로거 객체 반환
        """
        return self.logger

 

이 클래스를 사용하여 로깅을 설정하고 메시지를 기록하는 방법은 다음과 같습니다:

# MyLogger 인스턴스 생성
my_logger = MyLogger(name='MyAppLogger', level=logging.INFO).get_logger()

# 로깅 메시지 기록
my_logger.debug('디버그 메시지입니다.')
my_logger.info('정보 메시지입니다.')
my_logger.warning('경고 메시지입니다.')
my_logger.error('에러 메시지입니다.')
my_logger.critical('치명적인 에러 메시지입니다.')

 

이 코드는 MyAppLogger라는 이름의 로거를 생성하고, 로그 메시지를 파일(app.log)과 콘솔에 출력합니다. 로그 메시지에는 발생 시간, 로거 이름, 로그 레벨, 메시지가 포함됩니다.

로깅 레벨은 다음과 같은 순서로 정의됩니다: DEBUG < INFO < WARNING < ERROR < CRITICAL. level 파라미터를 통해 설정한 레벨 이상의 메시지만 출력됩니다. 위 예시에서는 level=logging.INFO로 설정했기 때문에, debug 메시지는 출력되지 않습니다.

'python > logging' 카테고리의 다른 글

Custom Logger 만들기 2 (일자별로 log 파일 생성)  (0) 2024.03.29
logging 설정하는 방법  (0) 2024.03.14

Python에서 파일이 존재하는지 확인

 

Python에서 파일이 존재하는지 확인하려면 os.path.exists() 함수를 사용할 수 있습니다. 이 함수를 사용하여 파일 경로를 전달하고 파일이 존재하는지 여부를 확인할 수 있습니다.

예를 들어, 다음은 주어진 파일 경로가 존재하는지 확인하는 방법입니다:

 

import os

file_path = "/path/to/file.txt"

if os.path.exists(file_path):
    print("File exists.")
else:
    print("File does not exist.")

 

위 코드에서 /path/to/file.txt는 확인하려는 파일 경로를 나타내는 문자열로 대체되어야 합니다. 이 코드는 해당 경로에 파일이 존재하는지 여부를 확인하고 결과를 출력합니다.

 


파일의 절대 경로에서 파일 이름만 추출하는 방법

 

파일의 절대 경로에서 파일 이름만 추출하는 방법은 os.path.basename() 함수를 사용하는 것입니다. 이 함수를 사용하여 파일의 전체 경로에서 파일 이름만 추출할 수 있습니다.

예를 들어, 다음은 주어진 파일의 절대 경로에서 파일 이름만 추출하는 방법입니다:

 

import os

file_path = "/path/to/file.txt"

file_name = os.path.basename(file_path)
print("File name:", file_name)

 

위 코드에서 /path/to/file.txt는 파일의 절대 경로를 나타내는 문자열로 대체됩니다. os.path.basename() 함수를 사용하여 이 경로에서 파일 이름만 추출하고 그것을 출력합니다. 출력 결과는 파일의 이름만 포함하게 됩니다.

 

1. Python 파일에서 직접 로깅을 사용하는 방법 

 

먼저, logging 모듈을 임포트합니다:

import logging

로깅을 설정합니다. 이는 로그 파일의 경로, 로그 레벨, 출력 형식 등을 지정하는 것입니다. 예를 들어, 다음과 같이 설정할 수 있습니다:

logging.basicConfig(filename='example.log',
      level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

위 코드는 로그를 파일 example.log에 기록하며, 로그 레벨은 DEBUG부터 표시됩니다. 로그의 포맷은 시간, 로그 레벨, 메시지를 포함합니다.

 

로그 메시지를 출력합니다. 이는 logging 모듈의 다양한 함수를 사용하여 수행할 수 있습니다. 예를 들어

logging.debug('이것은 디버그 메시지입니다.')
logging.info('이것은 정보 메시지입니다.')
logging.warning('이것은 경고 메시지입니다.')
logging.error('이것은 에러 메시지입니다.')
logging.critical('이것은 심각한 에러 메시지입니다.')

 

 

위와 같이 로깅을 설정하고 메시지를 출력하면, 각 메시지는 설정한 로그 레벨에 따라 출력됩니다. 예를 들어, 위 코드에서는 DEBUG 레벨부터 심각한 에러인 CRITICAL 레벨까지 모든 메시지가 출력됩니다.

 

로깅에 대한 더 자세한 정보는 Python 공식 문서를 참조하십시오: https://docs.python.org/3/library/logging.html

 

logging — Logging facility for Python

Source code: Lib/logging/__init__.py Important: This page contains the API reference information. For tutorial information and discussion of more advanced topics, see Basic Tutorial, Advanced Tutor...

docs.python.org

 

2. logging 을 파일과 콘솔 두군데 동시에 출력하기

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 함수를 호출하여 로그 레벨을 변경하면 로그 레벨이 변경됩니다.

 

'python > logging' 카테고리의 다른 글

Custom Logger 만들기 2 (일자별로 log 파일 생성)  (0) 2024.03.29
Custom Logger 만들기 1  (0) 2024.03.29

 

1. Streamlit 설치하기

먼저, Streamlit을 설치 합니다. 이를 위해 Python이 설치되어 있어야 하며, Python 3.6 이상 버전을 사용하는 것이 좋습니다. Python이 설치되어 있다면, 다음과 같은 명령어를 통해 Streamlit을 설치할 수 있습니다.

$ python -V
Python 3.6.8
$ pip -V
pip 21.3.1 from <user>.local/lib/python3.6/site-packages/pip (python 3.6)
$ 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만으로 데이터 애플리케이션을 빠르게 구축할 수 있습니다. 이제 기본적인 설치와 데모 실행 방법을 알게 되었으니, 다양한 프로젝트에 활용해 보겠습니다.

 

Pynecone이 Reflex로 브랜드를 변경했습니다. 

해당 사이트로 들어가보니 기존 Pynecone 프로젝트를 Reflex로 Migration하는 가이드가 있어서 적용했습니다.

 

1. pip로 reflex 설치

pip install reflex

설치후 기존 설치되었던 라이브러리와 비교해봅니다.

기존 Pynecone pip list reflex 설치후 pip list
pn@ed2cb8e6e508:/reflex/biz_board$ pip list
Package            Version
------------------ ----------
anyio              3.6.2
async-timeout      4.0.2
bidict             0.22.1
certifi            2022.12.7
charset-normalizer 3.0.1
click              8.1.3
cloudpickle        2.2.1
commonmark         0.9.1
distlib            0.3.6
fastapi            0.88.0
filelock           3.9.0
greenlet           2.0.2
gunicorn           20.1.0
h11                0.14.0
httpcore           0.16.3
httpx              0.23.3
idna               3.4
numpy              1.24.1
packaging          23.1
pandas             1.5.3
pip                23.2
pipenv             2022.12.19
platformdirs       2.6.2
plotly             5.13.0
psutil             5.9.4
pydantic           1.10.2
Pygments           2.14.0
PyMySQL            1.0.2
pynecone           0.1.29
python-dateutil    2.8.2
python-engineio    4.4.1
python-multipart   0.0.5
python-socketio    5.8.0
pytz               2022.7.1
redis              4.4.2
requests           2.28.2
rfc3986            1.5.0
rich               12.6.0
setuptools         65.5.1
six                1.16.0
sniffio            1.3.0
SQLAlchemy         1.4.41
sqlalchemy2-stubs  0.0.2a32
sqlmodel           0.0.8
starlette          0.22.0
tenacity           8.1.0
typer              0.4.2
typing_extensions  4.4.0
urllib3            1.26.14
uvicorn            0.20.0
virtualenv         20.17.1
virtualenv-clone   0.5.7
watchdog           2.3.1
websockets         10.4
wheel              0.38.4
pn@ed2cb8e6e508:/reflex/biz_board$
pn@ed2cb8e6e508:/reflex/biz_board$ pip list
Package            Version
------------------ ----------
alembic            1.11.1
anyio              3.6.2
async-timeout      4.0.2
bidict             0.22.1
certifi            2022.12.7
charset-normalizer 3.0.1
click              8.1.3
cloudpickle        2.2.1
commonmark         0.9.1
distlib            0.3.6
fastapi            0.96.1 <- 0.88.0
filelock           3.9.0
greenlet           2.0.2
gunicorn           20.1.0
h11                0.14.0
httpcore           0.16.3
httpx              0.24.1 <- 0.23.3
idna               3.4
Jinja2             3.1.2
Mako               1.2.4
markdown-it-py     3.0.0
MarkupSafe         2.1.3
mdurl              0.1.2
numpy              1.24.1
packaging          23.1
pandas             1.5.3
pip                23.2
pipenv             2022.12.19
platformdirs       2.6.2
plotly             5.13.0
psutil             5.9.4
pydantic           1.10.2
Pygments           2.14.0
PyMySQL            1.0.2
pynecone           0.1.29
python-dateutil    2.8.2
python-dotenv      0.13.0
python-engineio    4.4.1
python-multipart   0.0.5
python-socketio    5.8.0
pytz               2022.7.1
redis              4.4.2
reflex             0.2.1
requests           2.28.2
rfc3986            1.5.0
rich               13.4.2
setuptools         65.5.1
six                1.16.0
sniffio            1.3.0
SQLAlchemy         1.4.41
sqlalchemy2-stubs  0.0.2a32
sqlmodel           0.0.8
starlette          0.27.0
starlette-admin    0.9.0
tenacity           8.1.0
typer              0.4.2
typing_extensions  4.4.0
urllib3            1.26.14
uvicorn            0.20.0
virtualenv         20.17.1
virtualenv-clone   0.5.7
watchdog           2.3.1
watchfiles         0.19.0
websockets         10.4
wheel              0.38.4
pn@ed2cb8e6e508:/reflex/biz_board$

2. 기존 프로젝트에서 reflex init

pn@ed2cb8e6e508:/reflex/biz_board$ reflex init
────────────────────────────── Initializing biz_board ──────────────────────────────
[14:08:05] Initializing the web directory.                              console.py:30
Pynecone project detected. Automatically upgrade to Reflex? [y/n]: y
Renaming pcconfig.py to rxconfig.py
[14:08:16] Finished Initializing: biz_board                             console.py:30
pn@ed2cb8e6e508:/reflex/biz_board$

reflex init를 수행하면 해당 프로젝트의 모든 소스 파일들에서 참조하는 'import pynecone as pc' 가  'import reflex as rx'로 자동 변환됩니다. 

 

또한 pcconfig.py 파일이 위치하는 경로에  reflex init 파일이 자동으로 생성됩니다.

import reflex as rx

config = rx.Config(
    app_name="biz_board",
    api_url="http://서비스IP:8000",
    db_url="sqlite:///reflex.db",
    env=rx.Env.DEV,
)

 

3. 사용중인 pynecone.db 를 reflex db init

기존 pynecone.db 파일을 reflex.db 파일로 이름을 변경합니다. 그다음 reflex db init를 수행하면 새로운 reflex.db로 초기화를 해줍니다.

pn@ed2cb8e6e508:/reflex/biz_board$ reflex db init
──────────────────── [ State(rx.State) ] ────────────────────────
──────────────────── [ AuthState(State) ] ───────────────────────
──────────────────── [ ServiceState(State) ] ────────────────────
[biz_sqldata] get_biz_monitor_svc service_list len: 35
──────────────────── [ ServerState(State) ] ─────────────────────

[biz_servers] get_server_data(blank,)
Compiling:  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 4/4 0:00:00
  Creating directory '/reflex/biz_board/alembic' ...  done
  Creating directory '/reflex/biz_board/alembic/versions' ...  done
  Generating /reflex/biz_board/alembic/README ...  done
  Generating /reflex/biz_board/alembic/script.py.mako ...  done
  Generating /reflex/biz_board/alembic.ini ...  done
  Generating /reflex/biz_board/alembic/env.py ...  done
  Please edit configuration/connection/logging settings in '/reflex/biz_board/alembic.ini' before proceeding.
pn@ed2cb8e6e508:/reflex/biz_board$

 

이후 구동하면 기존과 동일하게 구동됩니다.

 

이후에는 reflex로 추가되는 작업을 올려야겠습니다.

시리즈 목록

윈도우(windows) WSL Ubuntu에 virtualenv 설치 및 vscode 연동
윈도우(windows) WSL Ubuntu에 pyenv 설치
윈도우(windows) WSL Ubuntu에 도커(Docker) 설치
윈도우(windows) WSL에 Ubuntu 20.04 LTS 추가 설치
윈도우(windows) WSL 명령어
윈도우(windows) WSL 설치 및 Ubuntu 구동

 

virtualenv 설치 

apt를 이용한 설치

sudo apt install python3-virtualenv

gabriel@NB-15052600:~$ sudo apt install python3-virtualenv
[sudo] password for gabriel:
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  javascript-common libjs-jquery libjs-sphinxdoc libjs-underscore libpython3-dev libpython3.10-dev
  python3-dev python3-distlib python3-distutils python3-filelock python3-lib2to3 python3-pip python3-pip-whl
  python3-platformdirs python3-setuptools python3-setuptools-whl python3-wheel python3-wheel-whl
  python3.10-dev
Suggested packages:
  apache2 | lighttpd | httpd python-setuptools-doc python2-pip-whl python2-setuptools-whl
The following NEW packages will be installed:
  javascript-common libjs-jquery libjs-sphinxdoc libjs-underscore libpython3-dev libpython3.10-dev
  python3-dev python3-distlib python3-distutils python3-filelock python3-lib2to3 python3-pip python3-pip-whl
  python3-platformdirs python3-setuptools python3-setuptools-whl python3-virtualenv python3-wheel
  python3-wheel-whl python3.10-dev
0 upgraded, 20 newly installed, 0 to remove and 0 not upgraded.
Need to get 10.6 MB of archives.
After this operation, 37.7 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://archive.ubuntu.com/ubuntu jammy/main amd64 javascript-common all 11+nmu1 [5936 B]
Get:2 http://archive.ubuntu.com/ubuntu jammy/main amd64 libjs-jquery all 3.6.0+dfsg+~3.5.13-1 [321 kB]
Get:3 http://archive.ubuntu.com/ubuntu jammy/main amd64 libjs-underscore all 1.13.2~dfsg-2 [118 kB]
Get:4 http://archive.ubuntu.com/ubuntu jammy/main amd64 libjs-sphinxdoc all 4.3.2-1 [139 kB]
Get:5 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libpython3.10-dev amd64 3.10.6-1~22.04.2ubuntuPreparing to unpack .../19-python3-virtualenv_20.13.0+ds-2_all.deb ...
Unpacking python3-virtualenv (20.13.0+ds-2) ...
Setting up javascript-common (11+nmu1) ...
Setting up python3-setuptools-whl (59.6.0-1.2ubuntu0.22.04.1) ...
Setting up python3-filelock (3.6.0-1) ...
Setting up python3-pip-whl (22.0.2+dfsg-1ubuntu0.2) ...
Setting up python3-distlib (0.3.4-1) ...
Setting up python3-platformdirs (2.5.1-1) ...
Setting up libpython3.10-dev:amd64 (3.10.6-1~22.04.2ubuntu1) ...
Setting up python3.10-dev (3.10.6-1~22.04.2ubuntu1) ...
Setting up libjs-jquery (3.6.0+dfsg+~3.5.13-1) ...
Setting up python3-lib2to3 (3.10.6-1~22.04) ...
Setting up python3-wheel-whl (0.37.1-2ubuntu0.22.04.1) ...
Setting up libjs-underscore (1.13.2~dfsg-2) ...
Setting up python3-distutils (3.10.6-1~22.04) ...
Setting up libpython3-dev:amd64 (3.10.6-1~22.04) ...
Setting up python3-setuptools (59.6.0-1.2ubuntu0.22.04.1) ...
Setting up python3-wheel (0.37.1-2ubuntu0.22.04.1) ...
Setting up python3-pip (22.0.2+dfsg-1ubuntu0.2) ...
Setting up libjs-sphinxdoc (4.3.2-1) ...
Setting up python3-virtualenv (20.13.0+ds-2) ...
Setting up python3-dev (3.10.6-1~22.04) ...
Processing triggers for man-db (2.10.2-1) ...
gabriel@NB-15052600:~$

 

설치된 버전 확인

gabriel@NB-15052600:~$ virtualenv --version
virtualenv 20.23.0 from /home/gabriel/.local/lib/python3.11/site-packages/virtualenv/__init__.py
gabriel@NB-15052600:~$

 

pip를통해서 virtualenv를 설치 

pip 로 설치했는데 virtualenv가 실행안되서 위의 apt로 추가로 설치했어요.

gabriel@NB-15052600:~$ python -m pip install --user virtualenv
Collecting virtualenv
  Downloading virtualenv-20.23.0-py3-none-any.whl (3.3 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.3/3.3 MB 9.7 MB/s eta 0:00:00
Collecting distlib<1,>=0.3.6
  Downloading distlib-0.3.6-py2.py3-none-any.whl (468 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 468.5/468.5 kB 9.1 MB/s eta 0:00:00
Collecting filelock<4,>=3.11
  Downloading filelock-3.12.0-py3-none-any.whl (10 kB)
Collecting platformdirs<4,>=3.2
  Downloading platformdirs-3.5.1-py3-none-any.whl (15 kB)
Installing collected packages: distlib, platformdirs, filelock, virtualenv
  WARNING: The script virtualenv is installed in '/home/gabriel/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed distlib-0.3.6 filelock-3.12.0 platformdirs-3.5.1 virtualenv-20.23.0

[notice] A new release of pip available: 22.3.1 -> 23.1.2
[notice] To update, run: pip install --upgrade pip
gabriel@NB-15052600:~$

 

virtualenv  가상환경 생성

virtualenv <환경이름> --python=<파이썬버전>

$ virtualenv auto --python=python3.11

 

virtualenv <환경이름> --python=<파이썬 설치경로>

$ virtualenv auto --python=/home/gabriel/.pyenv/shims/python

gabriel@NB-15052600:~/virtualenv$ virtualenv auto --python=python3.11
created virtual environment CPython3.11.3.final.0-64 in 650ms
  creator CPython3Posix(dest=/home/gabriel/virtualenv/auto, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/gabriel/.local/share/virtualenv)
    added seed packages: pip==22.0.2, setuptools==59.6.0, wheel==0.37.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator
gabriel@NB-15052600:~/virtualenv$

 

source ./auto/bin/activate

gabriel@NB-15052600:~/virtualenv$ ll
total 12
drwxr-xr-x 3 gabriel gabriel 4096 May 19 12:46 ./
drwxr-x--- 6 gabriel gabriel 4096 May 19 12:39 ../
drwxr-xr-x 4 gabriel gabriel 4096 May 19 12:46 auto/
gabriel@NB-15052600:~/virtualenv$ cd auto/
gabriel@NB-15052600:~/virtualenv/auto$ ll
total 24
drwxr-xr-x 4 gabriel gabriel 4096 May 19 12:46 ./
drwxr-xr-x 3 gabriel gabriel 4096 May 19 12:46 ../
-rw-r--r-- 1 gabriel gabriel   40 May 19 12:46 .gitignore
drwxr-xr-x 2 gabriel gabriel 4096 May 19 12:46 bin/
drwxr-xr-x 3 gabriel gabriel 4096 May 19 12:46 lib/
-rw-r--r-- 1 gabriel gabriel  337 May 19 12:46 pyvenv.cfg
gabriel@NB-15052600:~/virtualenv/auto$ source ./bin/activate
(auto) gabriel@NB-15052600:~/virtualenv/auto$ python -V
Python 3.11.3
(auto) gabriel@NB-15052600:~/virtualenv/auto$ which python
/home/gabriel/virtualenv/autogpt/bin/python
(auto) gabriel@NB-15052600:~/virtualenv/auto$
(auto) gabriel@NB-15052600:~/virtualenv/auto$ pip list
Package    Version
---------- -------
pip        22.0.2
setuptools 59.6.0
wheel      0.37.1
(auto) gabriel@NB-15052600:~/virtualenv/auto$ pwd
/home/gabriel/virtualenv/auto
(auto) gabriel@NB-15052600:~/virtualenv/auto$ deactivate
gabriel@NB-15052600:~/virtualenv/auto$

 

Visual Studio Code 설치 및 WSL 연동

 

vscode에서 Remote Explorer에 Default 를 WSL Target > Ubuntu 로 default distro를 지정한다. (기존 아마 docker)

 

Ubuntu 명령창에서 code . 실행해서 VS Code 뜨는지 확인

 

만일 에러가 아래와 같이 발생하면 참조

https://github.com/microsoft/vscode/issues/148913

 

VS Code Server for WSL closed unexpectedly · Issue #148913 · microsoft/vscode

[2022-05-06 14:14:46.048] WSL Daemon exited with code 0 [2022-05-06 14:14:45.086] Resolving wsl+Ubuntu-20.04, resolveAttempt: 1 [2022-05-06 14:14:45.227] Starting VS Code Server inside WSL (wsl2) [...

github.com

 

Terminal > New Terminal

 

 

시리즈 목록

윈도우(windows) WSL Ubuntu에 virtualenv 설치 및 vscode 연동
윈도우(windows) WSL Ubuntu에 pyenv 설치
윈도우(windows) WSL Ubuntu에 도커(Docker) 설치
윈도우(windows) WSL에 Ubuntu 20.04 LTS 추가 설치
윈도우(windows) WSL 명령어
윈도우(windows) WSL 설치 및 Ubuntu 구동

 

Ubuntu 22.04 LTS에는 python3가 설치되어있다. pip, venv는 설치되어 있지 않음

gabriel@NB-15052600:~$ python -V
Command 'python' not found, did you mean:
  command 'python3' from deb python3
  command 'python' from deb python-is-python3
gabriel@NB-15052600:~$ python3 -V
Python 3.10.6
gabriel@NB-15052600:~$ python3 -m pip
/usr/bin/python3: No module named pip
gabriel@NB-15052600:~$

 

1.pyenv 설치

 

참고 https://github.com/pyenv/pyenv

git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

 

 

gabriel@NB-15052600:~$ pyenv install 3.11.3
Downloading Python-3.11.3.tar.xz...
-> https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tar.xz
Installing Python-3.11.3...

BUILD FAILED (Ubuntu 22.04 using python-build 2.3.17-10-g920ef145)

Inspect or clean up the working tree at /tmp/python-build.20230515214905.2289
Results logged to /tmp/python-build.20230515214905.2289.log

Last 10 log lines:
checking for pkg-config... no
checking for --enable-universalsdk... no
checking for --with-universal-archs... no
checking MACHDEP... "linux"
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/tmp/python-build.20230515214905.2289/Python-3.11.3':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
gabriel@NB-15052600:~$

설치 에러가 발생할경우 apt 업데이트를 수행한다.

sudo apt update
sudo apt install \
    build-essential \
    curl \
    libbz2-dev \
    libffi-dev \
    liblzma-dev \
    libncursesw5-dev \
    libreadline-dev \
    libsqlite3-dev \
    libssl-dev \
    libxml2-dev \
    libxmlsec1-dev \
    llvm \
    make \
    tk-dev \
    wget \
    xz-utils \
    zlib1g-dev

 

gabriel@NB-15052600:~$ pyenv install 3.11.3
Downloading Python-3.11.3.tar.xz...
-> https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tar.xz
Installing Python-3.11.3...
Installed Python-3.11.3 to /home/gabriel/.pyenv/versions/3.11.3
gabriel@NB-15052600:~$

 

원하는 버전 지정

 

pyenv local 3.11.3  <어플리케이션별로 파이썬 버전을 설정하는데 사용>

pyenv global 3.11.3 <전역 파이썬 버전을 설정>

gabriel@NB-15052600:~$ pyenv --versions
pyenv: no such command `--versions'
gabriel@NB-15052600:~$ pyenv versions
* system (set by /home/gabriel/.pyenv/version)
  3.11.3
gabriel@NB-15052600:~$ pyenv local 3.11.3
gabriel@NB-15052600:~$ pyenv versions
  system
* 3.11.3 (set by /home/gabriel/.python-version)
gabriel@NB-15052600:~$
gabriel@NB-15052600:~$ python -V
Python 3.11.3
gabriel@NB-15052600:~$

 

 

파이썬 버전이 제도로 적용도었는지 확인

gabriel@NB-15052600:~$ pyenv which python
/home/gabriel/.pyenv/versions/3.11.3/bin/python
gabriel@NB-15052600:~$

 

 

시리즈 목록

윈도우(windows) WSL Ubuntu에 virtualenv 설치 및 vscode 연동
윈도우(windows) WSL Ubuntu에 pyenv 설치
윈도우(windows) WSL Ubuntu에 도커(Docker) 설치
윈도우(windows) WSL에 Ubuntu 20.04 LTS 추가 설치
윈도우(windows) WSL 명령어
윈도우(windows) WSL 설치 및 Ubuntu 구동

 

WSL 설치 및 Ubuntu 최신(2023.05 기준 22.04) 설치는 아래 링크 참조

 

윈도우(windows) WSL 설치 및 Ubuntu 구동

개발 환경구성에서는 Windows 10/11 PC에서 Linux 서브 운영체제로 Ubuntu를 사용해서 Docker 및 Python 개발환경을 구성하도록 합니다. - 서브운영체제를 위한 WSL 설치 - WSL에 Ubuntu 구동 - Docker Desktop 대신 Ub

amnesia.tistory.com

 

1.Update APT Repository 업데이트

sudo apt update

Ubuntu 설치에서 업데이트 까지 완료되었다면, 모든 패키가 업데이트 되었다고 표시됩니다.

gabriel@NB-15052600:~$ sudo apt update
[sudo] password for gabriel:
Get:1 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Hit:2 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Get:4 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [108 kB]
Fetched 337 kB in 9s (38.6 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
gabriel@NB-15052600:~$

 

2. Docker 설치

아래 명령을 사용하여 Docker를 설치합니다. 이때 '-y' 옵션은 필요한 패키지를 자동으로 설치할수 있는 권한을 부여합니다.

sudo apt install docker.io -y

 

 

3. 새로운 User (docker)를 생성

Docker 설치후 아래 명령을 이용해서 "docker"라는 이름으로 새로운 사용자 그룹(User Group)을 만들어 줍니다.

sudo usermod -aG docker $USER

4. 설치된 Docker Version 확인

설치 확인을 위해서 WSL Ubuntu에  docker 버전을 확인합니다.

docker --version

Docker 버전 20.10.21 이 설치된것을 확인 할 수 있습니다.

 

5. 관리자권한의 PowerShell에서 WSL을 Shutdown 

관리자권한의 powershell에서 wsl을 shutdown 합니다.

 

wsl --shutdown

 

6. Linux Ubuntu에서 Docker 예제 구동

Ubuntu 새로 구동후 설치된 Docker 확인

 

docker run -p 8081:80 -d nginx

 

gabriel@NB-15052600:~$ docker run -p 8081:80 -d nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
9e3ea8720c6d: Pull complete
bf36b6466679: Pull complete
15a97cf85bb8: Pull complete
9c2d6be5a61d: Pull complete
6b7e4a5c7c7a: Pull complete
8db4caa19df8: Pull complete
Digest: sha256:480868e8c8c797794257e2abd88d0f9a8809b2fe956cbfbc05dcc0bca1f7cd43
Status: Downloaded newer image for nginx:latest
df8ddfad5a2c5585a0918098e98c3deda0cf57b9816691b7f4b6612bbb8ee7f6
gabriel@NB-15052600:~$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS
            NAMES
df8ddfad5a2c   nginx     "/docker-entrypoint.…"   11 seconds ago   Up 9 seconds   0.0.0.0:8081->80/tcp, :::8081->80/tcp   pensive_ishizaka
gabriel@NB-15052600:~$

 

http://localhost:8081/

 

잘구동 되었네요...

 

docker-compose 수동설치

https://github.com/docker/compose/releases/

gabriel@NB-15052600:~$ sudo chmod -R 777 /usr/local/bin
gabriel@NB-15052600:~$ curl -SL https://github.com/docker/compose/releases/download/v2.17.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 51.9M  100 51.9M    0     0  9236k      0  0:00:05  0:00:05 --:--:-- 10.9M
gabriel@NB-15052600:~$ sudo chmod +x /usr/local/bin/docker-compose
gabriel@NB-15052600:~$ docker-compose --version
Docker Compose version v2.17.3
gabriel@NB-15052600:~$
gabriel@NB-15052600:~$
gabriel@NB-15052600:~$

 

docker-compose 설치 버전확인

 

 

 

시리즈 목록

윈도우(windows) WSL Ubuntu에 virtualenv 설치 및 vscode 연동
윈도우(windows) WSL Ubuntu에 pyenv 설치
윈도우(windows) WSL Ubuntu에 도커(Docker) 설치
윈도우(windows) WSL에 Ubuntu 20.04 LTS 추가 설치
윈도우(windows) WSL 명령어
윈도우(windows) WSL 설치 및 Ubuntu 구동

목록확인

PS C:\Users\gabriel> wsl --list --online
다음은 설치할 수 있는 유효한 배포판 목록입니다.
'wsl.exe --install <Distro>'를 사용하여 설치합니다.

NAME                                   FRIENDLY NAME
Ubuntu                                 Ubuntu
Debian                                 Debian GNU/Linux
kali-linux                             Kali Linux Rolling
Ubuntu-18.04                           Ubuntu 18.04 LTS
Ubuntu-20.04                           Ubuntu 20.04 LTS
Ubuntu-22.04                           Ubuntu 22.04 LTS
OracleLinux_7_9                        Oracle Linux 7.9
OracleLinux_8_7                        Oracle Linux 8.7
OracleLinux_9_1                        Oracle Linux 9.1
SUSE-Linux-Enterprise-Server-15-SP4    SUSE Linux Enterprise Server 15 SP4
openSUSE-Leap-15.4                     openSUSE Leap 15.4
openSUSE-Tumbleweed                    openSUSE Tumbleweed
PS C:\Users\gabriel>

 

설치

PS C:\Users\gabriel> wsl --install -d Ubuntu-20.04
설치 중: Ubuntu 20.04 LTS
Ubuntu 20.04 LTS이(가) 설치되었습니다.
Ubuntu 20.04 LTS을(를) 시작하는 중...
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: gabriel
New password:
Retype new password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 4.4.0-19041-Microsoft x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Mon May 15 19:06:59 KST 2023

  System load:    0.52      Users logged in:        0
  Usage of /home: unknown   IPv4 address for eth1:  172.23.64.1
  Memory usage:   47%       IPv4 address for eth2:  172.28.0.1
  Swap usage:     0%        IPv4 address for wifi0: 192.168.0.20
  Processes:      8

1 update can be applied immediately.
To see these additional updates run: apt list --upgradable


The list of available updates is more than a week old.
To check for new updates run: sudo apt update


This message is shown once a day. To disable it please create the
/home/gabriel/.hushlogin file.
gabriel@NB-15052600:~$

 

버전확인

cat /etc/lsb-release

gabriel@NB-15052600:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"
gabriel@NB-15052600:~$

 

 

+ Recent posts