7.2 Python 개발 환경 구축
Zenoh는 순수 Python 라이브러리가 아니라 컴파일된 Rust 네이티브 코어 엔진을 내포한 고성능 미들웨어(Middleware) 체계이다. 따라서 운영체제(OS) 아키텍처 사양을 고려하지 않은 무분별한 패키지 설치는 C-ABI 레벨의 동적 링크 라이브러리(DLL/SO) 오류를 초래할 수 있다.
본 절에서는 표준 클라우드 서버 환경부터 ARM64 기반의 에지(Edge) 로보틱스 모드에 이르기까지 Zenoh를 가장 안정적으로 배치(Deployment)하기 위한 설치 가이드라인을 다룬다. 기본 패키지 관리자를 통한 설치부터 아키텍처 최적화를 위한 소스 기반 빌드(Build-from-source) 기법, 그리고 설치 검증을 위한 퍼블리셔(Publisher)와 서브스크라이버(Subscriber) 테스트 코드를 기술한다.
1. 시스템 요구 사항 및 Python 버전 호환성 판단
Zenoh Python 바인딩은 C-ABI 확장 모듈로 동작하므로, 대상 시스템의 Python 런타임 환경에 대한 매우 엄격한 호환성 기준을 요구한다.
1. Python 생태계 버전 제약
Zenoh는 더 이상 지원이 종료된 레거시 Python(3.6 이하) 아키텍처를 지원하지 않으며, 최소 Python 3.8 이상의 런타임이 필수적으로 요구된다. 딕셔너리 연산 트리가 최적화된 Python 3.11 이상의 환경 사용이 성능 측면에서 권장된다.
2. 운영체제 플랫폼 및 CPU 아키텍처
- x86_64 기반 OS (Linux/Windows/macOS): CI/CD 파이프라인에서 이미 교차 컴파일된
Wheel (.whl)바이너리 형식으로 배포되므로 별도의 컴파일러 툴체인(Toolchain) 없이 즉시 설치된다. - ARM64 (Jetson Nano, Raspberry Pi 등): 최근 릴리즈에서는 ARM64 아키텍처용
Wheel도 지원된다. 다만 32비트 운영체제(예: 구형 Raspbian)를 구동할 경우 적합한 바이너리를 찾지 못하고 소스 빌드 모드로 격하되며, 이 과정에서 Rust 컴파일러 부재로 인한 심각한 설치 오류가 발생한다. 따라서 대상 에지 장비는 반드시 64Bit OS로 마이그레이션해야 한다.
3. 가상 환경(Virtual Environment)의 격리
의존성 출동을 방지하기 위해 가상 환경 레이어 설정은 필수적 요건이다. 시스템 전역(Global)에 설치하는 방식은 피해야 한다.
python3 -m venv zenoh_env
source zenoh_env/bin/activate
2. PyPI를 통한 기본 패키지 설치 (pip install eclipse-zenoh)
환경 격리가 완료된 후에는 표준 패키지 매니저를 통해 최신 안정화 버전을 획득한다.
# 최신 안정화 버전(Stable API) 설치
pip install eclipse-zenoh
설치 시 터미널 상에 Building wheel for eclipse-zenoh (setup.py)와 같은 소스 컴파일 지시 메시지가 장시간 지속될 경우, 이는 해당하는 OS 버전에 부합하는 바이너리 패키지가 배포되지 않아 로컬 Rust 컴파일을 시도하고 있음을 의미한다.
설치 완료 후 인터프리터에서 아래와 같이 배포 버전을 출력함으로써 정상 이스케이프 여부를 검증한다.
import zenoh
print(zenoh.__version__)
# 예상 출력: 1.0.0 (또는 사용 중인 릴리즈 버전)
3. 소스 코드 기반 빌드 및 커스텀 설치 방식
특수한 RISC-V 보드 환경 또는 GitHub 레포지토리의 최신 개발 실험(Master Branch) 기능을 활용해야 할 경우, 파이썬 패키지를 네이티브 Rust 환경에서 직접 컴파일해야 한다. 이를 지원하기 위해 maturin 빌드 툴체인이 필요하다.
1. 의존성 무기고(Dependencies) 세팅
# 1. Rust 컴파일러 설치 (운영체제 전역)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
# 2. Python 바인딩 컴파일러(maturin) 및 빌드 툴 설치
pip install setuptools maturin
2. 소스코드 직접 추출 및 바이너리 연성
# Eclipse 재단의 Zenoh Python 레포지토리 복제(Clone)
git clone https://github.com/eclipse-zenoh/zenoh-python.git
cd zenoh-python
# Maturin 도구를 통해 Rust 코드를 Release 모드로 컴파일 및 현재 파이썬 환경에 주입
maturin develop --release
주의사항: 반드시 --release 플래그를 삽입하여 최적화 및 인라인(Inline) 심볼 정리가 완료된 상태로 빌드해야 한다. 디버그(Debug) 모드 컴파일 시 네트워크 스루풋 성능이 1/10 단위로 저하되는 현상이 발생한다.
4. 개발 환경 테스트: 퍼블리셔와 서브스크라이버 기본 통합
정상적인 환경 구축 이후, 이를 입증하기 위한 최소 기능의 텔레메트리(Telemetry) 발신 및 수신 스크립트를 작성하여 테스트를 수행한다. 백그라운드의 분산 라우팅 상태를 확인하는 과정이다.
1. 수신계 컴포넌트: Subscriber (터미널 A)
파일 생성: sub_test.py
import zenoh
import time
# Zenoh 네트워크 세션 초기화 (자동 피어 라우팅 및 멀티캐스트 탐색)
session = zenoh.open()
print("망(Network) 수신 안테나 가동. ['demo/hello'] Key Expression 대기 중...")
# 수신 콜백(Callback) 함수 정의
def listener(sample):
print(f">> 수신 확인 | 출처: {sample.key_expr} | 본문: {sample.payload.decode('utf-8')}")
# 구독 채널 확립
sub = session.declare_subscriber("demo/hello", listener)
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print("\n세션 데몬 종료")
2. 발신계 컴포넌트: Publisher (터미널 B)
파일 생성: pub_test.py
import zenoh
import time
session = zenoh.open()
print("목표 지향(Routing): 'demo/hello'")
pub = session.declare_publisher("demo/hello")
# 임의의 데이터 스트림 5회 순차 발송
for i in range(5):
msg = f"Zenoh Python API Integration Test - 시퀀스 {i+1}"
pub.put(msg)
print(f"발송 완료: {msg}")
time.sleep(0.5)
print("작전 프로세스 종료.")
sub_test.py 가 구동 중인 환경에서 pub_test.py 를 실행하면, Publisher 에서 발생한 데이터 스트림이 마이크로초 단위의 최소 지연(Delay)만으로 즉각 수신측 스레드에 도착하는 것을 확인할 수 있다. 만약 양방향 도달이 불가한 구조적 오류에 직면한다면, 라우터 서브넷 방화벽(통상 멀티캐스트 포트 7447)이 개방되어 있는지 점검(Troubleshooting)해야 한다.