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=True
a 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=True
pará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.sh
tiene el shebang#!/bin/sh
y tiene los permisos de archivo adecuados, ejecútelochmod u+rx sleep.sh
para asegurarse de que esté dentro,$PATH
entonces 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 alsubprocess
módulo en su lugar:fuente
En realidad, solo debes agregar el
shell=True
argumento:Pero cuidado -
fuente
fuente
sleep.sh
no 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.sh
tenga permisos de ejecución y ejecútelo conshell=True
:fuente
#!bin/bash
Falta el error en/
.#!/bin/bash
funciona como lo noto en una respuesta.Si chmod no funciona, intente también
prueba por mi gracias
fuente
os.system
documentación recomienda específicamente evitarlo a favor desubprocess
(estos díassubprocess.run()
). Si no puede irsubprocess
a 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 found
si 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=True
pero sí, normalmente evitarlo es tu mejor jugada.