Airflow에서 PythonOperator는 우리가 작성한 Python 함수를 현재 Airflow 환경에서 실행합니다.
반면, PythonVirtualenvOperator는 조금 다릅니다
Airflow와 완전히 분리된 가상환경(virtual environment)을 임시로 만들어, 그 안에서 함수를 실행하죠.
이게 바로 import 문을 함수 안쪽에 넣어야 하는 핵심 이유입니다.
1. PythonVirtualenvOperator란?
PythonVirtualenvOperator는 Airflow가 제공하는 특수한 Operator로,
DAG 내에서 별도의 독립된 Python 환경을 생성해 함수를 실행할 수 있습니다.
예를 들어 다음과 같이 정의할 수 있습니다:
from airflow.operators.python import PythonVirtualenvOperator
def run_new_pandas():
import pandas as pd
print("Running pandas:", pd.__version__)
task = PythonVirtualenvOperator(
task_id='virtualenv_pandas_task',
python_callable=run_new_pandas,
requirements=['pandas==2.0.3'],
dag=dag,
)
이 코드를 실행하면, Airflow는 다음을 수행합니다:
- /tmp 경로 아래에 임시 virtualenv 생성
- requirements로 지정한 라이브러리(pandas==2.0.3) 설치
- 해당 환경 안에서 run_new_pandas() 실행
2. 함수 내부에 import를 넣는 이유
Airflow의 가상환경 실행 방식 때문에,
import문을 함수 밖(파일 상단) 에 작성하면 문제가 생길 수 있습니다.
예를 들어 아래처럼 작성하면
import pandas as pd # Airflow 환경 기준 import
def run_new_pandas():
print(pd.__version__)
이 코드는 Airflow가 DAG을 불러올 때 이미 pandas를 import하려고 시도합니다.
그런데 Airflow가 설치된 환경에는 pandas가 없을 수도 있죠.
결과적으로 Broken DAG 오류나 ModuleNotFoundError가 발생할 수 있습니다.
따라서 PythonVirtualenvOperator를 사용할 때는
함수 내부에서 필요한 라이브러리를 import하는 것이 안전한 방법입니다
정리하면
| 구분 | 설명 |
| Operator 이름 | pythonVirtualenvOperator |
| 역할 | 독립된 가상환경을 생성해 Python 함수 실행 |
| 가상환경 독립성 | Airflow의 메인 Python 환경과 분리됨 |
| import 위치 | 반드시 함수 내부에 작성 |
| 이유 | 외부 import 시 Airflow 환경에서 먼저 불러오기 때문 |
Airflow의 PythonVirtualenvOperator는
매 Task 실행 시마다 새로운 가상환경을 만들어 독립적으로 함수를 실행합니다.
따라서 필요한 패키지는 함수 안에서 직접 import해야
해당 환경 안에서 올바르게 인식되고, DAG 로딩 시 오류도 피할 수 있습니다.
'컨테이너·워크플로우 자동화 > Airflow로 워크플로우 자동화하기' 카테고리의 다른 글
| Airflow에서 system_site_packages와 requirements 함께 쓰기 (0) | 2025.10.17 |
|---|---|
| Airflow의 PythonVirtualenvOperator — 왜 requirements를 지정해야 할까? (0) | 2025.10.17 |
| Airflow의 Operator와 Sensor — 태스크의 핵심 구성요소 이해하기 (0) | 2025.10.14 |
| Airflow X Postgres 연동 학습 — Provider 기반 실습 튜토리얼 (0) | 2025.10.14 |
| Airflow Operator — 하나의 작업에는 하나의 오퍼레이터 (0) | 2025.10.13 |