Запуск 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

испытайте меня спасибо