Python 18

[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위 코드는 다..

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] Exception: task_done() called too many times

Python의 queue.Queue에서 "task_done() called too many times" 오류가 발생하는 이유는 task_done() 메서드를 get()으로 가져온 아이템 수보다 더 많이 호출했기 때문입니다.발생 원리Queue는 내부적으로 "처리되지 않은 작업 수(unfinished tasks)"를 카운터로 관리합니다.put()으로 아이템을 넣을 때마다 카운터가 +1task_done()을 호출할 때마다 카운터가 -1카운터가 0보다 작아지려고 하면 이 오류가 발생주요 원인들get() 없이 task_done() 호출import queueq = queue.Queue()q.put("item")q.task_done() # get()을 하지 않았는데 task_done() 호출 - 오류!task_do..

[python] 코드가 실행중일 때, 디버깅 중인지 확인하는 방법

개요파이썬으로 만든 코드를 디버깅할 때와 실제 배포하여 실행될 때 서로 다른 동작을 시켜야할 경우가 있습니다. 디버깅할 때는 디버깅을 위하여 보다 상세한 정보를 출력한다던지 성능과 관계없이 디버깅을 위한 부분을 더 추가해 주게 되는데, 실제 실행할 때는 불필요한 부분입니다.이번에는 파이썬 코드가 실행중일 때, 디버깅 중인지 확인하는 방법을 알아 보도록 하겠습니다.sys.gettrace()from sys import gettracedef is_debugging(): return (gettrace() != None)DEBUGPY_RUNNING 환경변수from os import getenvdef is_debugging(): return bool(getenv('DEBUGPY_RUNNING'))pdb ..

[Python] 품질 설정과 함께 이미지를 JPEG로 저장 방법들

개요Python에서 이미지를 품질 (Quality)을 지정하여 JPEG 형식으로 저장하는 여러 가지 방법을 정리해 둡니다.PIL(Python Imaging Library)/Pillowfrom PIL import Image# 이미지 열기img = Image.open('input.png')# JPEG로 저장img.save('output.jpg', format = 'JPEG')# 품질 설정하여 저장 (1-95)img.save('output_quality.jpg', 'JPEG', quality=85)# RGB로 변환 후 저장 (알파 채널이 있는 경우)img_rgb = img.convert('RGB')img_rgb.convert('RGB').save('output_rgb.jpg', 'JPEG')가장 널리 사용되는..

[python] netmask 문자열로 CIDR 형식의 비트 개수를 반환하는 방법

개요netmask 문자열(예: "255.255.255.0")을 CIDR 형식의 비트 개수(접두사 길이)를 얻는 방법을 정리해 둡니다.CIDR 표기법이란?CIDR(Classless Inter-Domain Routing) 형식은 IP 주소와 네트워크 마스크를 표현하는 간결하고 유연한 방법입니다. CIDR 표기법의 주요 특징은 다음과 같습니다.IP 주소와 접두사 길이로 구성: 예를 들어, 192.168.0.0/24 형태로 표현합니다.접두사 길이: '/' 뒤의 숫자(0-32)로, 네트워크 부분의 비트 수를 나타냅니다.유연한 네트워크 구분: 기존의 클래스 기반 주소 체계와 달리, 네트워크와 호스트 부분을 유연하게 정의할 수 있습니다.효율적인 IP 주소 관리: 네트워크 주소 자원을 절약하고 효율적으로 할당할 수 있..

[jetson] Namespace GstRtspServer not available 오류 해결 방법

문제점 및 증상 DeepStream SDK 파이썬 예제중에서 "rtsp"로 출력하는 예제를 실행했더니, 다음과 같이 "ValueError: Namespace GstRtspServer not available" 오류가 발생하였습니다. nvidia@nvidia-OrinNX16G:/opt/nvidia/deepstream/deepstream/sources/deepstream_python_apps/apps/deepstream-test1-rtsp-out$ python deepstream_test1_rtsp_out.py Traceback (most recent call last): File "deepstream_test1_rtsp_out.py", line 26, in gi.require_version('GstRtsp..

[python] Could not find a version that satisfies the requirement torch==1.11.0+cu113

문제점 및 증상"PyTorch v1.11.0+cu113"를 설치하는 과정에서 다음과 같은 오류를 만났습니다.$ pip install torch==1.11.0+cu113ERROR: Could not find a version that satisfies the requirement torch==1.11.0+cu113 (from versions: 1.11.0, 1.12.0, 1.12.1, 1.13.0, 1.13.1, 2.0.0, 2.0.1, 2.1.0, 2.1.1, 2.1.2, 2.2.0, 2.2.1, 2.2.2, 2.3.0)ERROR: No matching distribution found for torch==1.11.0+cu113시험 환경HW: Intel i5 / 16GB RAMGPU: NVIDIA RTX..

[Python] JSON 문자열 다루기

개요 JSON 문자열을 dict로 변환하거나, 반대로 dict를 JSON 문자열로 변한하여 처리하는 방법을 알아보겠습니다. dict를 JSON 문자열로 변환하기 간단하게 json.dumps() 함수를 이용하면 됩니다. from json import dumps json_str = dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) print(json_str) """ Result>>> ["foo", {"bar": ["baz", null, 1.0, 2]}] """ 주의할 점은 한글과 같이 UTF 문자열 데이터가 포함되어 있는 dict를 dumps() 함수로 문자열로 변환을 시도하면 다음과 같이 인코딩되어 변환되기 때문에 바로 읽을 수가 없게 됩니다. from json impor..

[Python] 라즈베리파이 GPIO 제어하기 - 기초

개요 라즈베리파이에서 GPIO를 제어하는 방법을 알아보겠습니다. 패키지 설치 라즈베리파이에서 GPIO를 제어하기 위해서는 "RPi.GPIO" 패키지가 필요합니다. 다음과 같이 "RPi.GPIO" 패키지를 설치할 수 있습니다. $ pip install RPi.GPIO GPIO 제어 간단 출력 예제 다음은 GPIO를 이용한 간단한 출력 예제입니다. import time import RPi.GPIO as GPIO LED = 3 # LED 제어용 GPIO 핀 DELAY = 0.3 # GPIO를 BCM 칩 기준으로 GPIO.setmode(GPIO.BCM) # LED 를 위한 핀을 출력으로 설정 GPIO.setup(LED, GPIO.OUT) try: while True: # LED 켜기 GPIO.output(LED..

728x90