컨테이너·워크플로우 자동화/Airflow로 워크플로우 자동화하기

Airflow의 PythonVirtualenvOperator — 왜 함수 안에 import를 넣어야 할까?

Data Jun 2025. 10. 17. 21:36

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는 다음을 수행합니다:

  1. /tmp 경로 아래에 임시 virtualenv 생성
  2. requirements로 지정한 라이브러리(pandas==2.0.3) 설치
  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 로딩 시 오류도 피할 수 있습니다.