web-dev-qa-db-fra.com

Importation d'un module local (script python) dans Airflow DAG

J'essaie d'importer un module local (un script python) dans mon DAG.

Structure du répertoire:

airflow/
├── dag
│   ├── __init__.py
│   └── my_DAG.py
└── script
    └── subfolder
        ├── __init__.py
        └── local_module.py

Exemple de code dans my_DAG.py:

#trying to import from local module
from script.subfolder import local_module  

#calling a function in local_module.py  
a = some_function()  

Je reçois une erreur dans Airflow disant "DAG cassé: mon_DAG. Aucun module nommé 'local_module'.

J'ai mis à jour Airflow vers 1.9.0 mais cela ne résout pas le problème.

  • Quelle est la solution ici?
  • J'ai également lu quelque part que je pouvais résoudre ce problème en créant un plugin. Quelqu'un peut-il indiquer comment je peux le faire?

Merci.

18
badangatal

Cela a généralement à voir avec la configuration d'Airflow.

Dans airflow.cfg, assurez-vous que le chemin dans airflow_home est correctement défini sur le chemin d'accès à la structure du répertoire Airflow.

Ensuite, Airflow analyse tous les sous-dossiers et les remplit afin que les modules puissent être trouvés.

Sinon, assurez-vous simplement que le dossier que vous essayez d'importer se trouve dans le chemin Python: Comment utiliser PYTHONPATH

3
tobi6

La façon dont je le fais est la suivante:

  1. créez un script Python dans votre sous-dossier avec une fonction main ().
  2. dans votre fichier dag inclure une déclaration de chemin pour le sous-dossier et le fichier

Vous pouvez maintenant utiliser ce script dans votre PythonOperator

import sys
sys.path.insert(0,"/root/airflow/dags/subfolder"))
import subfolder.script_name as script
...    
t1=PythonOperator(
    task_id='python_script',
    python_callable=script.main,
    dag=dag
)
0
Shaby