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.

La ejecución de un script de shell mediante Subprocess en Python no produce salida.

Estoy intentando ejecutar un script de shell utilizando Python a través de subprocess.Popen().

El script de shell solo tiene las siguientes líneas:


#!/bin/sh echo Hola mundo

El siguiente es el código de Python:

print("EJECUTANDO SCRIPT DE SHELL AHORA")
scriptshell = subprocess.Popen(['km/ejemplo/ejemplo1/fuente/prueba.sh'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
scriptshell.wait()

for linea in scriptshell.stdout.readlines():
    print(linea)
print("EL SCRIPT DE SHELL FINALIZÓ")

Sin embargo, al ejecutar esto, solo obtengo la siguiente salida:

EJECUTANDO SCRIPT DE SHELL AHORA
EL SCRIPT DE SHELL FINALIZÓ

Es decir, no estoy recibiendo la salida del script de shell entre estas 2 líneas.

Además, cuando elimino la parte stderr=subprocess.PIPE del subprocess, obtengo la siguiente salida:

EJECUTANDO SCRIPT DE SHELL AHORA
'km' no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable.
EL SCRIPT DE SHELL FINALIZÓ

No puedo entender cómo resolver esto y ejecutar correctamente el script de shell. Por favor guíame. Gracias.

ACTUALIZAR:

También intenté el siguiente cambio:

print("EJECUTANDO SCRIPT DE SHELL AHORA")
scriptshell = subprocess.Popen(['km/ejemplo/ejemplo1/fuente/prueba.sh'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

out, err = scriptshell.communicate()
print(out)
print("EL SCRIPT DE SHELL FINALIZÓ")

Obtengo la siguiente salida:

EJECUTANDO SCRIPT DE SHELL AHORA
b''
EL SCRIPT DE SHELL FINALIZÓ
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar en cómo se llama al script de shell en Python utilizando subprocess.Popen(). Aquí hay algunas sugerencias que podrían ayudar a resolver el problema:

    1. En lugar de usar shell=True, intente pasar el script de shell como una lista de argumentos a subprocess.Popen(). Por ejemplo:
      shellscript = subprocess.Popen(['sh', 'km/example/example1/source/test.sh'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
      
    2. Elimine por completo el argumento shell=True, ya que no es necesario para este caso de uso.
    3. Dentro del script de shell, agregue un carácter de nueva línea al comando echo para asegurarse de que la salida se vacíe correctamente. Por ejemplo:

      #!/bin/sh
      echo "Hola Mundo\n"
      

    Con estos cambios, el código de Python actualizado debería parecerse a esto:

    print("EJECUTANDO EL SCRIPT DE SHELL AHORA")
    shellscript = subprocess.Popen(['sh', 'km/example/example1/source/test.sh'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    
    out, err = shellscript.communicate()
    print(out.decode('utf-8'))
    print("EJECUCIÓN DE SCRIPT DE SHELL FINALIZADA")
    

    Esto debería ejecutar correctamente el script de shell e imprimir la salida dentro del script de Python.

Comments are closed.