프로그래밍/Python 124

[python] "@dataclass"를 활용하여 클래스 작성을 빠르게 해보자

파이썬 3.7에서 도입된 @dataclass 데코레이터는 클래스 작성 방식을 획기적으로 바꾸어 놓은 기능입니다. 복잡하고 반복적인 보일러플레이트 코드(boilerplate code)를 자동화하여 개발자가 핵심 로직에 집중할 수 있도록 도와줍니다.@dataclass란 무엇인가?@dataclass는 파이썬의 dataclasses 모듈에 포함된 데코레이터로, 클래스 선언에 붙여 사용합니다. 이 데코레이터는 클래스의 필드를 기반으로 __init__, __repr__, __eq__ 등의 특수 메서드를 자동으로 생성해줍니다.기본 사용법from dataclasses import dataclass@dataclassclass Person: name: str age: int email: str위 코드는 다..

[python] 비동기 IO에서 코루틴과 태스크의 차이점은?

파이썬 비동기 I/O (AsyncIO)에서 코루틴(Coroutine) 과 태스크(Task) 는 밀접하게 관련되어 있지만, 명확한 차이가 있습니다. 이 둘의 관계를 이해하는 것이 AsyncIO를 효과적으로 사용하는 데 중요합니다.코루틴 (Coroutine)정의: 코루틴은 async def 키워드로 정의된 함수입니다. 일반 함수와 달리, 코루틴은 실행 중에 일시 중단(suspend)되었다가 나중에 중단된 지점부터 다시 시작할 수 있습니다.특징await 키워드를 사용하여 다른 코루틴의 실행이 완료될 때까지 기다릴 수 있습니다. await는 I/O 작업(네트워크 요청, 파일 읽기/쓰기 등)이 완료될 때까지 블로킹 없이 기다리게 해주어, 그동안 다른 코루틴이 실행될 수 있도록 제어권을 이벤트 루프에 반환합니다.a..

[python] asyncio.gather() 함수와 asyncio.wait() 함수의 차이는?

asyncio.gather()와 asyncio.wait()는 모두 여러 코루틴(또는 태스크)을 동시에 실행하고 그 결과를 기다리는 데 사용되는 asyncio 라이브러리의 핵심 함수입니다. 하지만 동작 방식과 사용 목적에 있어서 중요한 차이점이 있습니다.asyncio.gather(*aws, return_exceptions=False)목적: 여러 개의 awaitable 객체(코루틴, 태스크, 퓨처 등)를 그룹으로 묶어 함께 실행하고, 모든 awaitable이 완료될 때까지 기다린 후 그 결과를 수집합니다.반환 값: 모든 awaitable의 결과가 담긴 리스트를 반환합니다. 이 리스트의 순서는 입력된 awaitable의 순서와 동일합니다.예외 처리기본적으로 return_exceptions=False입니다. 이..

[python] asyncio로 비동기 코루틴으로 두 개중 하나가 종료되면, 나머지도 종료하기

비동기 코루틴 두 개 중 하나라도 완료되면 나머지 태스크를 종료하고 프로그램이 종료되도록 하려면 asyncio.wait와 asyncio.FIRST_COMPLETED를 사용하고, 완료되지 않은 태스크를 취소하는 로직을 추가해야 합니다.다음은 이를 구현한 예제 코드입니다.import asyncioasync def task_one(): print("Task One: 시작") try: await asyncio.sleep(3) # 3초 대기 print("Task One: 완료") return "Task One 완료됨" except asyncio.CancelledError: print("Task One: 취소됨") raiseasync ..

[python] weekday를 각 OS 언어별 문자열로 변환하는 방법

파이썬에서 날짜의 요일을 각 운영체제(OS) 언어(로케일)별 문자열로 바꾸려면, 주로 locale 모듈과 strftime 메서드를 조합해 사용합니다.locale 모듈과 strftime 사용locale.setlocale(locale.LC_TIME, '로케일명')으로 원하는 언어 환경을 설정합니다.datetime 객체의 strftime('%A') 또는 strftime('%a')를 사용하면, OS 로케일에 맞는 요일 문자열을 얻을 수 있습니다.from datetime import datetimefrom locale import LC_TIME, setlocaledt = datetime(2025, 6, 18)# 영어(미국)setlocale(locale.LC_TIME, 'en_US.UTF-8')print(dt.st..

[python] requests - 응답을 UTF-8로 지정하여 받는 방법

requests 기본 사용법파이썬 requests 패키지로 웹 페이지의 HTML 소스를 가져올 때, 기본적으로 .text 속성을 사용하면 HTML 소스가 문자열로 반환됩니다. 이때, requests는 응답의 헤더에서 인코딩 정보를 자동으로 감지해 해당 인코딩으로 디코딩합니다.import requestsurl = "https://www.wikipedia.org/"response = requests.get(url)html = response.text # 자동 인코딩 감지 및 디코딩print(html)UTF-8로 강제 인코딩 지정간혹 서버가 인코딩 정보를 잘못 제공하거나, 한글 등 특수문자가 깨지는 경우가 있습니다. 이럴 때는 .encoding 속성을 직접 'utf-8'로 지정해줄 수 있습니다.import ..

ctypes.addressof() 함수를 이용하여 bytes 객체를 만드는 방법

Python에서 ctypes.addressof() 함수의 반환값(메모리 주소)을 이용해 일정 길이만큼 bytes 객체를 만드는 방법을 알아 보겠습니다.방법 1: ctypes.string_at() 사용 (권장)import ctypes# 예시: 배열 생성arr = (ctypes.c_int * 5)(1, 2, 3, 4, 5)addr = ctypes.addressof(arr)# 주소에서 특정 길이만큼 bytes로 읽기length = ctypes.sizeof(arr) # 또는 원하는 길이data = ctypes.string_at(addr, length)print(type(data)) # print(data.hex()) # 0100000002000000030000000400000005000000방법 2: ct..

[python] pytest에서 "ModuleNotFoundError: No module named 'apt_pkg'" 오류 발생 문제

문제점 및 증상python3에서 pytest를 설치 후, 실행하였을 때 다음과 같은 오류가 발생하였습니다.$ pytest test-1.pyTraceback (most recent call last): File "/usr/lib/command-not-found", line 28, in from CommandNotFound import CommandNotFound File "/usr/lib/python3/dist-packages/CommandNotFound/CommandNotFound.py", line 19, in from CommandNotFound.db.db import SqliteDatabase File "/usr/lib/python3/dist-packages/CommandNotFo..

[python] 쉘의 파이프 "|"를 subprocess.Popne()으로 처리하는 방법

개요보안성 등을 높이기 위하여 shell=False로 subprocess.run()을 사용할 때는 쉘 기능이 비활성화되므로 "ls | grep txt" 같은 파이프라인 명령어를 문자열로 넘길 수 없습니다. 이번 글에서는 쉘에서 파이프로 여러 명령을 연결하여 처리하는 것을 파이썬으로 어떻게 구현하는지 알아보도록 하겠습니다.기본적인 쉘 명령과 shell=True예를 들어, 리눅스에서 다음과 같은 명령을 실행한다고 해볼까요?ls | grep txt이 명령은 현재 디렉토리에서 txt라는 문자열이 포함된 파일만 출력합니다. Python에서 이걸 단순히 실행하려면 shell=True로 아래와 같이 할 수 있습니다.from subprocess import runresult = run("ls | grep txt", s..

PyInstaller - "ModuleNotFoundError: No module named 'debugpy'" 문제 해결하기

개요개발과 배포 환경 사이의 차이로 인해 종종 예상치 못한 문제가 발생합니다.최근 제가 겪은 PyInstaller 배포 시, 발생한 debugpy 관련 오류와 해결 과정을 공유하고자 합니다.스레드 내부 디버깅 설정멀티스레드 애플리케이션을 개발하던 중, 스레드 디버깅을 위해 debugpy를 사용하고 있었습니다.from debugpy import debug_this_thread# 스레드 코드의 일부def worker_thread(): debug_this_thread() # 디버깅을 위한 함수 호출 # 스레드 작업 수행... ...위와 같이 스레드 실행부에 debug_this_thread() 함수를 호출하여 개발 중에는 정상적으로 디버깅을 할 수 있었습니다.발생한 오류그러나 PyInstall..

728x90