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)
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:
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 usarPopen()
ycommunicate()
,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) destderr
utilizando el argumentostderr=subprocess.PIPE
. Luego, después de ejecutar el comando, he verificado si hubo algún error utilizando el argumentocheck=True
. Si hay un error, se generará una excepciónCalledProcessError
y podrás acceder al mensaje de error a través de su atributostderr
.Finalmente, he impreso las variables
result
yerror
. Ten en cuenta que la variableresult
puede contener tanto la salida estándar como la salida de error, dependiendo de lo que el comando escriba en cada flujo.