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 organizar un flujo perfecto utilizando argumentos de cmd?

Hola, estoy intentando aplicar Prefect a mi proyecto que utiliza la biblioteca “click” para tratar los parámetros de la línea de comandos. A continuación se muestra un ejemplo de código:

@click.command()
@click.option(
    "-p",
    "--pages",
    type=int,
    default=0,
    help="...",
)
def main(pages):
    print("Ejecutando...")
    if pages > 0:
      a()
    else:
      b()
    print("Finalizado sin errores.")

if name == "main":
    main()
    another_method()

En la documentación de Prefect se menciona el siguiente ejemplo:

flow = Flow("hello-flow", tasks=[hello_task])
flow.register(project_name="tester")

Pero, ¿qué sucede si necesito ejecutar el programa usando, por ejemplo, “poetry run main.py -p 10”, donde necesito proporcionar un parámetro fijo en la línea de comandos y también ejecutarlo con poetry? En ese caso, ¿cómo debo organizar o refactorizar mi código para que se adapte a Prefect?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para integrar click y poetry con Prefect, puedes crear una nueva tarea que envuelva tu función de comando existente de click, y luego definir una nueva función main que llame a esta tarea usando Prefect. Aquí tienes un ejemplo de cómo podrías refactorizar tu código para lograr esto:

    import click
    from prefect import task, Flow, Parameter
    
    @task
    @click.command()
    @click.option(
        "-p",
        "--pages",
        type=int,
        default=0,
        help="...",
    )
    def click_main(pages):
        print("Ejecutando...")
        if pages > 0:
            a()
        else:
            b()
        print("Finalizado sin errores.")
    
    if __name__ == "__main__":
        with Flow('mi-flujo') as flow:
            pages = Parameter('pages', default=10)
            click_main(pages=pages)
    
        # ahora podemos ejecutar el flujo con Prefect
        flow.run()
    

    Aquí, hemos creado una nueva tarea llamada click_main que envuelve tu función de comando existente de click. Esta tarea está decorada con el decorador @task de Prefect, lo que nos permite usarla como una tarea en un flujo de Prefect.

    También hemos definido una nueva función main que utiliza Prefect para crear un nuevo flujo. Dentro del flujo, hemos definido un único parámetro llamado pages, que tiene un valor predeterminado de 10. Luego hemos agregado la tarea click_main al flujo, pasando el parámetro pages como argumento.

    Finalmente, podemos ejecutar el flujo usando flow.run(). Esto llamará a nuestra tarea click_main con el valor de pages que proporcionamos (por defecto, 10 si no se proporcionó ningún valor en la línea de comandos).

    Para ejecutar este código con poetry, puedes usar el comando poetry run como de costumbre:

    poetry run python main.py
    

    Esto ejecutará la función main, que a su vez ejecutará la tarea click_main como parte de un flujo de Prefect. Si deseas pasar argumentos de línea de comandos a la tarea click_main, puedes usar el comando poetry run con los argumentos que desees:

    poetry run python main.py --pages 5
    

    Esto ejecutará la tarea click_main con pages establecido en 5.

Comments are closed.