es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo ejecuto Python en un entorno conda con airflow?

conda 4.10.1
airflow 2.2.2

Normalmente, ejecuto un script de la siguiente manera:


conda activate env
python /ruta al script/script.py

Así que puse esos dos comandos en un script de bash y usé el operador bashOperator de la siguiente manera:

t1 = BashOperator(
task_id='testtask',
depends_on_past=False,
bash_command='/ruta al bash/script.bash',
retries=0,
)

y obtuve el temido error “conda is not setup to activate environments”.

Luego hice lo siguiente:


conda init bash
conda activate env
python /ruta al script/script.py

pero por supuesto, la shell tiene que reiniciarse, lo cual no sé cómo hacer en apache airflow. Debe haber argumentos predeterminados o algo secreto en el .bashrc, etc. para activar los entornos anaconda en modo no interactivo, pero soy un trasplante de conda de Windows y un tutorial no está cerca.

Hay esta otra solución que básicamente hace un montón de cosas complicadas para iniciar Python en el entorno de su elección,
https://stackoverflow.com/questions/49738173/how-to-run-airflow-pythonoperator-in-a-virtual-environment/58440405#58440405

El truco secreto es ejecutar Python en el entorno:


bash_command='~/anaconda3/envs/env_of_choice/bin/python
/python_files/python_task1.py',

¡Este tipo pudo hacerlo en Anaconda 3.9!

https://stackoverflow.com/questions/66122360/how-to-change-working-directory-and-specify-conda-environment-in-apache-airflow

Pero misteriosamente, mi entorno y mi entorno base tienen el mismo Python. Cuando escribo “env” para ambos entornos, la diferencia está en lo siguiente:


conda_shlvl=2 en lugar de 1
conda_prefix_1 = usuarios/yo/opt/anaconda3
path incluye /usuarios/yo/opt/anaconda3/envs/env_of_choice/bin
conda_prefix=/usuarios/yo/opt/anaconda3/envs/env_of_choice
conda_default_env=sfdc

Hay varias formas de proceder. Tal vez no configuré el entorno correctamente y está utilizando el Python base en lugar de crear un Python en el entorno virtual. Usé un archivo yml. También es muy tentador simplemente establecer estas variables de entorno en DAG, pero tal vez no sea la forma aceptada. No pude encontrar un tutorial. ¿Cuál es el camino correcto? ¿O tal vez mi versión, 4.10.1, es demasiado avanzada y debería retroceder a 3.9? Hay demasiadas opciones. ¿Algún consejo?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en Anaconda y Airflow, aquí están algunas soluciones posibles para el problema de activación de conda:

    1. Una solución es agregar el comando de activación de conda al principio del bash_command en el BashOperator. Por ejemplo:
    t1 = BashOperator(
        task_id='testtask',
        depends_on_past=False,
        bash_command='conda activate env && python /ruta hacia el script/script.py',
        retries=0,
    )
    

    Esto activará el ambiente env antes de ejecutar el script.

    1. Otra solución es utilizar el PythonVirtualenvOperator en lugar de BashOperator. Este operador crea un ambiente virtual e instala los paquetes requeridos antes de ejecutar el script Python. Por ejemplo:
    from airflow.operators.python_operator import PythonVirtualenvOperator
    
    t1 = PythonVirtualenvOperator(
        task_id='testtask',
        python_callable=my_function,
        requirements=['pandas', 'numpy'],
        system_site_packages=False,
        dag=dag,
    )
    

    Esto creará un ambiente virtual con los paquetes especificados y ejecutará la función Python my_function.

    1. Si prefieres activar el ambiente conda manualmente, puedes establecer las variables de ambiente en el archivo DAG. Por ejemplo:
    import os
    
    os.environ['PATH'] = '/ruta hacia el binario de conda:' + os.environ['PATH']
    os.environ['CONDA_PREFIX'] = '/ruta hacia el ambiente de conda/nombre_ambiente'
    
    t1 = BashOperator(
        task_id='testtask',
        depends_on_past=False,
        bash_command='python /ruta hacia el script/script.py',
        retries=0,
    )
    

    Esto establece las variables de ambiente para que BashOperator use el ambiente conda correcto.

    En cuanto a si debes bajar de versión o quedarte con tu versión actual de conda, depende de tus necesidades y requerimientos específicos. Generalmente, se recomienda utilizar la última versión estable si es posible. Sin embargo, si estás experimentando problemas con una versión más reciente, puede valer la pena probar una versión anterior para ver si eso resuelve el problema.

Comments are closed.