Запуск bash script изнутри python
У меня проблема со следующим кодом:
callBash.py:
import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
sleep.sh:
sleep 10
Я хочу, чтобы "конец" печатался через 10 секунд. (Я знаю, что это глупый пример, я просто мог бы спать внутри python, но этот простой файл sleep.sh был как тест)
Ответы
Ответ 1
Выполнение исполняемого файла sleep.sh и добавление shell=True
в список параметров (как предложено в предыдущих ответах) работает нормально. В зависимости от пути поиска вам также может потребоваться добавить ./
или другой подходящий путь. (Т.е., измените "sleep.sh"
на "./sleep.sh"
.)
Параметр shell=True
не нужен (в системе Posix, такой как Linux), если первая строка bash script - это путь к оболочке; например, #!/bin/bash
.
Ответ 2
На самом деле вам просто нужно добавить аргумент shell=True
:
subprocess.call("sleep.sh", shell=True)
Но будьте осторожны -
Предупреждение Вызов системной оболочки с оболочкой = True может быть угрозой безопасности в сочетании с ненадежным вводом. Подробнее см. В разделе "Часто используемые аргументы".
источник
Ответ 3
Если sleep.sh
имеет shebang #!/bin/sh
и имеет соответствующие права доступа к файлам - запустите chmod u+rx sleep.sh
, чтобы убедиться, что он находится в $PATH
, тогда ваш код должен работать как есть:
import subprocess
rc = subprocess.call("sleep.sh")
Если script не находится в PATH, то укажите полный путь к нему, например, если он находится в текущем рабочем каталоге:
from subprocess import call
rc = call("./sleep.sh")
Если script не имеет shebang, тогда вам нужно указать shell=True
:
rc = call("./sleep.sh", shell=True)
Если script не имеет исполняемых разрешений, и вы не можете его изменить, например, запустив os.chmod('sleep.sh', 0o755)
, вы можете прочитать script в виде текстового файла и передать строку вместо subprocess
:
with open('sleep.sh', 'rb') as file:
script = file.read()
rc = call(script, shell=True)
Ответ 4
Убедитесь, что sleep.sh
имеет разрешения на выполнение, и запустите его с помощью shell=True
:
#!/usr/bin/python
import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"
Ответ 5
Если кто-то ищет вызов скрипта с аргументами
import subprocess
val = subprocess.check_call("./script.sh '%s'" % arg, shell=True)
не забудьте преобразовать аргументы в строку перед передачей, используя str (arg).
Это может использоваться для передачи как можно большего количества аргументов
subprocess.check_call("./script.ksh %s %s %s" % (agr1, str(arg2), arg3), shell=True)
Ответ 6
Добавление ответа, потому что я был направлен здесь после того, как спросил, как запустить bash script из python. Вы получаете сообщение об ошибке OSError: [Errno 2] file not found
, если ваш script принимает параметры. Скажем, например, ваш script взял параметр времени сна: subprocess.call("sleep.sh 10")
не будет работать, вы должны передать его как массив: subprocess.call(["sleep.sh", 10])
Ответ 7
Если chmod не работает, вы также пытаетесь
import os
os.system('sh script.sh')
#you can also use bash instead of sh
испытайте меня спасибо