개발중/AirFlow

Airflow DAG에서 모듈 임포트가 안 될 때: 상대경로 vs 절대경로 해결

Binsoo 2025. 4. 7.
728x90
반응형

 

Airflow DAG를 만들면서 `PythonOperator`에서 내가 만든 파이썬 함수를 import하려고 했다.  

근데 생각대로 되지 않았기에 기록을 남기려 한다. ㅠㅠ


예를 들어 이런 구조로 작업 중이었다.

 

dags/

└── repo/

└── client-test/

└── soobin/

    ├── tutorial.py 

    ├── update_pending_records.py 

 

 

 

처음에는 `tutorial.py`에서 상대경로로 import를 시도했었다.

시도 1

from .update_pending_records import update_pending_records

 

시도 2

from ape.update_pending_records import update_pending_records

 

 

하지만 DAG이 Airflow에 등록되면서 바로 깨졌다.

Airflow 로그에는 이런 메시지가 떴다.

 

ImportError: attempted relative import with no known parent package

 

 

상대경로 import는 일반적인 Python 모듈에서는 잘 되지만,
Airflow에서는 DAG 파일이 “루트 스크립트”처럼 실행되기 때문에 상대경로를 허용하지 않는다.

 

그래서 이런 방식을 시도해봤다 ✅

 

Airflow는 기본적으로 dags/ 경로를 PYTHONPATH로 인식한다는 점에 착안해서, 절대 경로 import를 시도해봤다.

 

import os
import sys

# 현재 파일 기준으로 상위 디렉토리를 경로에 추가
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from ape.update_pending_records import update_pending_records

 

 

이렇게 하니까 DAG import 에러가 깨끗이 사라지고, 정상적으로 실행되었다.

 

요약하자면

  • Airflow는 상대경로 import를 기본적으로 지원하지 않는다
  • from .xxx import yyy 는 사용하지 말자 (깨진다)
  • 절대경로 import가 가장 안전하다
  • 필요하다면 sys.path.append()를 활용해서 명시적으로 경로를 추가할 것

 

 

 

 

 

 

 

728x90
반응형

댓글