Tengo un problema con el siguiente código:
callBash.py:
import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
sleep.sh:
sleep 10
Quiero que el "final" se imprima después de 10 segundos. (Sé que este es un ejemplo tonto, simplemente podría dormir dentro de Python, pero este simple archivo sleep.sh fue solo como una prueba)

Respuestas:
Hacer que sleep.sh sea ejecutable y agregarlo
shell=Truea la lista de parámetros (como se sugiere en las respuestas anteriores) funciona bien. Dependiendo de la ruta de búsqueda, es posible que también deba agregar./o alguna otra ruta adecuada. (Es decir, cambie"sleep.sh"a"./sleep.sh".)El
shell=Trueparámetro no es necesario (en un sistema Posix como Linux) si la primera línea del script bash es una ruta a un shell; por ejemplo#!/bin/bash,.fuente
Si
sleep.shtiene el shebang#!/bin/shy tiene los permisos de archivo adecuados, ejecútelochmod u+rx sleep.shpara asegurarse de que esté dentro,$PATHentonces su código debería funcionar como está:Si el script no está en la RUTA, especifique la ruta completa, por ejemplo, si está en el directorio de trabajo actual:
Si el script no tiene shebang, debe especificar
shell=True:Si el script no tiene permisos ejecutables y no puede cambiarlo, por ejemplo, al ejecutarlo
os.chmod('sleep.sh', 0o755), puede leer el script como un archivo de texto y pasar la cadena alsubprocessmódulo en su lugar:fuente
En realidad, solo debes agregar el
shell=Trueargumento:Pero cuidado -
fuente
fuente
sleep.shno está enPATH. Y si está en el camino y tiene el shebang correcto, entonces no es necesarioshell=True. Vea mi respuestaSi alguien busca llamar a un script con argumentos
Recuerde convertir los argumentos en una cadena antes de pasar, usando str (arg).
Esto se puede usar para pasar tantos argumentos como desee:
fuente
Asegúrese de que
sleep.shtenga permisos de ejecución y ejecútelo conshell=True:fuente
#!bin/bashFalta el error en/.#!/bin/bashfunciona como lo noto en una respuesta.Si chmod no funciona, intente también
prueba por mi gracias
fuente
os.systemdocumentación recomienda específicamente evitarlo a favor desubprocess(estos díassubprocess.run()). Si no puede irsubprocessa trabajar, es probable que también tenga problemasos.system().Agregando una respuesta porque me dirigieron aquí después de preguntar cómo ejecutar un script bash desde python. Recibe un error
OSError: [Errno 2] file not foundsi su secuencia de comandos admite parámetros. Digamos, por ejemplo, que su script tomó un parámetro de tiempo de suspensión:subprocess.call("sleep.sh 10")no funcionará, debe pasarlo como una matriz:subprocess.call(["sleep.sh", 10])fuente
shell=Truepero sí, normalmente evitarlo es tu mejor jugada.