J'ai une série de tâches Python dans un dossier de fichiers python: file1.py, file2.py, ...
J'ai lu les documents Airflow, mais je ne vois pas comment spécifier le dossier et le nom de fichier des fichiers python dans le DAG?
Je voudrais exécuter ces fichiers python (pas la fonction Python via Python)).
Tâche1: exécuter file1.py (avec un package d'importation)
Tâche2: exécuter file2.py (avec un autre package d'importation)
Ce serait utile. Merci, salutations
Pour exécuter le fichier python dans son ensemble, en utilisant le BashOperator
(comme dans la réponse de liferacer):
from airflow.operators.bash_operator import BashOperator
bash_task = BashOperator(
task_id='bash_task',
bash_command='python file1.py',
dag=dag
)
Ensuite, pour le faire en utilisant la fonction PythonOperator
appelez votre fonction main
. Vous devriez déjà avoir un __main__
block, donc mettez ce qui s'y passe dans une fonction main
, de sorte que votre file1.py
ressemble à ceci:
def main():
"""This gets executed if `python file1` gets called."""
# my code
if __name__ == '__main__':
main()
Ensuite, votre définition de dag:
from airflow.operators.python_operator import PythonOperator
import file1
python_task = PythonOperator(
task_id='python_task',
python_callable=file1.main,
dag=dag
)
Je sais que vous demandez que vous "souhaitez exécuter ces fichiers python (pas la fonction Python via Python Operator). "Mais je vois cela comme utilisant probablement Airflow moins efficacement que vous ne pourriez l'être. Je vois aussi de la confusion dans les réponses écrites précédemment, alors voici la façon dont vous vouliez, et la façon dont je recommanderais de faire les tâches:
En supposant:
dags/
my_dag_for_task_1_and_2.py
tasks/
file1.py
file2.py
Votre demande pour éviter le PythonOperator
:
# my_dag_for_task_1_and_2.py
import datetime as dt
from airflow import DAG
from airflow.operators import BashOperator
with DAG(
'my_dag_for_task_1_and_2',
default_args={
'owner': 'me',
'start_date': datetime(…),
…,
},
schedule_interval='8 * * * *',
) as dag:
task_1 = BashOperator(
task_id='task_1',
bash_command='/path/to/python /path/to/dags/tasks/file1.py',
)
task_2 = BashOperator(
task_id='task_2',
bash_command='/path/to/python /path/to/dags/tasks/file2.py',
)
task_1 >> task_2
Vous n'avez pas écrit le Python à partir de zéro pour Airflow, mais avec PythonOperator
:
# my_dag_for_task_1_and_2.py
import datetime as dt
from airflow import DAG
from airflow.operators import PythonOperator
import tasks.file1
import tasks.file2
with DAG(
'my_dag_for_task_1_and_2',
default_args={
'owner': 'me',
'start_date': datetime(…),
…,
},
schedule_interval='8 * * * *',
) as dag:
task_1 = PythonOperator(
task_id='task_1',
python_callable=file1.function_in_file1,
)
task_2 = PythonOperator(
task_id='task_2',
python_callable=file2.function_in_file2, # maybe main?
)
task_1 >> task_2
Vous pouvez utiliser BashOperator pour exécuter des fichiers python comme tâche
from airflow import DAG
from airflow.operators import BashOperator,PythonOperator
from datetime import datetime, timedelta
seven_days_ago = datetime.combine(datetime.today() - timedelta(7),
datetime.min.time())
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': seven_days_ago,
'email': ['[email protected]'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5),
)
dag = DAG('simple', default_args=default_args)
t1 = BashOperator(
task_id='testairflow',
bash_command='python /home/airflow/airflow/dags/scripts/file1.py',
dag=dag)