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.

Obteniendo la salida de ejecutar el comando de shell en Python – gcloud create dataproc cluster

Estoy intentando obtener el expire-dataproc-tag al ejecutar gcloud-dataproc-create-cluster usando python

Intenté subprocess.Popen, el problema creo que se debe a que es un ERROR o que tarda mucho tiempo en recuperar el resultado, y termino con una cadena vacía.

Probé el comando y el comando1 funcionó correctamente, el problema aparece al ejecutar el comando2

import subprocess

command = "echo hello world"
command<em>1 = "gcloud compute images list --project {project-id} --no-standard-images"
command</em>2 = 'gcloud beta dataproc clusters create cluster-name --bucket {bucket} --region europe-west1 --zone europe-west1-b --subnet {subnet} --tags {tag} --project {project-id} --service-account {service-account} --master-machine-type n1-standard-16 --master-boot-disk-size 100 --worker-machine-type n1-standard-1 --worker-boot-disk-size 100 --image {image} --max-idle 2h --metadata enable-oslogin=true --properties {properties} --optional-components=ANACONDA,JUPYTER,ZEPPELIN --enable-component-gateway --single-node --no-address'.split(' ')

process = subprocess.Popen(command_2, stdout=subprocess.PIPE, shell=True)

process.wait()

try:
    print('inside-try')
    result, err = process.communicate()
    result = result.decode('utf-8')
except Exception as e:
    print('The Error', e)

print('the result: ', result)
print("the-error: ", err)

La salida es

inside-try
ERROR: (gcloud.beta.dataproc.clusters.create) INVALID_ARGUMENT: La imagen personalizada de Dataproc '{nombre-de-imagen}' ha caducado. Por favor, reconstruye esta imagen personalizada. Para extender la fecha de caducidad de la imagen personalizada a '2022-02-11T08:29:58.322549Z', utiliza esta propiedad del clúster durante la creación del clúster: 'dataproc:dataproc.custom.image.expiration.token=1.{nombre-de-imagen-propiedades...}'
the result:
the-error: None

Estoy intentando obtener el ERROR: …. en la variable result (para imprimirlo después del resultado)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para capturar el mensaje de ERROR del resultado del comando gcloud utilizando Python, puedes redirigir la salida de error al tubo (pipe) y luego leerlo junto con la salida estándar. Aquí te muestro cómo puedes modificar tu código:

    import subprocess
    
    command = "gcloud beta dataproc clusters create cluster-name --bucket {bucket} --region europe-west1 --zone europe-west1-b --subnet {subnet} --tags {tag} --project {project-id} --service-account {service-account} --master-machine-type n1-standard-16 --master-boot-disk-size 100 --worker-machine-type n1-standard-1 --worker-boot-disk-size 100 --image {image} --max-idle 2h --metadata enable-oslogin=true --properties {properties} --optional-components=ANACONDA,JUPYTER,ZEPPELIN --enable-component-gateway --single-node --no-address".split(' ')
    
    try:
        process = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True, text=True)
        result = process.stdout
        error = process.stderr
    except subprocess.CalledProcessError as e:
        result = ""
        error = e.stderr
    
    print('el resultado: ', result)
    print('el error: ', error)
    

    En este código, he utilizado el método subprocess.run() que es una forma más moderna de ejecutar comandos externos en Python. En lugar de usar Popen() y communicate(), run() proporciona una forma más simple de ejecutar un comando, capturar su resultado y verificar si hay errores.

    Aquí, he redirigido la salida de error estándar (stderr) al tubo (pipe) de stderr utilizando el argumento stderr=subprocess.PIPE. Luego, después de ejecutar el comando, he verificado si hubo algún error utilizando el argumento check=True. Si hay un error, se generará una excepción CalledProcessError y podrás acceder al mensaje de error a través de su atributo stderr.

    Finalmente, he impreso las variables result y error. Ten en cuenta que la variable result puede contener tanto la salida estándar como la salida de error, dependiendo de lo que el comando escriba en cada flujo.

Comments are closed.