Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬에서 시그널 번호로 시그널 이름을 얻는 방법

파이썬에는 숫자 형태의 시그널 번호를 통해 해당 시그널의 이름을 바로 조회하는 전용 함수가 제공되지 않습니다. 하지만 signal 모듈의 내부 속성들을 활용하면 충분히 구현할 수 있습니다.

핵심 아이디어는 다음과 같습니다. 먼저 signal.__dict__를 사용해 signal 모듈의 모든 속성을 가져온 후, 이름이 SIG로 시작하는 항목만 필터링합니다. 이때 SIG_로 시작하는 상수는 제외해야 원하는 시그널 이름만 깔끔하게 남길 수 있습니다. 마지막으로 필터링된 결과를 키와 값을 뒤집어 딕셔너리에 저장하면, 시그널 번호를 키로 삼아 이름을 쉽게 찾을 수 있는 매핑 테이블이 완성됩니다.

예제 코드

import signal
sig_items = reversed(sorted(signal.__dict__.items()))
final = dict((k, v) for v, k in sig_items if v.startswith('SIG') and not v.startswith('SIG_'))
print(final)

위 코드에서 sorted()reversed()를 조합한 이유는, 동일한 값에 여러 이름이 연결된 경우 나중에 정의된 이름이 우선하도록 처리 순서를 조정하기 위함입니다.

실행 결과

위 코드를 실행하면 다음과 같이 시그널 객체를 키로, 시그널 이름을 값으로 가지는 딕셔너리가 출력됩니다:

{<Signals.SIGTERM: 15>: 'SIGTERM', <Signals.SIGSEGV: 11>: 'SIGSEGV',
<Signals.SIGINT: 2>: 'SIGINT', <Signals.SIGILL: 4>: 'SIGILL',
<Signals.SIGFPE: 8>: 'SIGFPE', <Signals.SIGBREAK: 21>: 'SIGBREAK',
<Signals.SIGABRT: 22>: 'SIGABRT'}

이렇게 만든 딕셔너리를 활용하면 예를 들어 final[2]처럼 시그널 번호만으로도 'SIGINT'와 같은 이름을 즉시 얻을 수 있어, 시그널 핸들러 로깅이나 디버깅 작업에 유용하게 사용할 수 있습니다.