Запуск скрипта bash из python



у меня проблема со следующим кодом:



callBash.py:



import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"


sleep.sh:



sleep 10


Я хочу, чтобы" конец " был напечатан после 10 С. (Я знаю, что это глупый пример, я мог бы просто спать в python, но это просто sleep.sh файл был просто как тест)

881   7  

7 ответов:

создание sleep.sh исполняемый файл и добавление shell=True к списку параметров (как предлагалось в предыдущих ответах) работает нормально. В зависимости от пути поиска, вам также может потребоваться добавить ./ или какой-то другой подходящий путь. (Т. е. изменить "sleep.sh" до "./sleep.sh".)

The shell=True параметр не нужен (в системе Posix, такой как Linux), если первая строка скрипта bash является путем к оболочке; например,#!/bin/bash.

на самом деле, вы просто должны добавить :

subprocess.call("sleep.sh", shell=True)

но будьте осторожны -

предупреждение вызов оболочки системы с shell=True может представлять угрозу безопасности в сочетании с ненадежным вводом. Дополнительные сведения см. в предупреждении в разделе Часто используемые аргументы.

источник

если sleep.sh имеет shebang #!/bin/sh и он имеет соответствующие права доступа к файлам -- run chmod u+rx sleep.sh чтобы убедиться, и это в $PATH тогда ваш код должен работать как есть:

import subprocess

rc = subprocess.call("sleep.sh")

если скрипт не находится в пути, укажите полный путь к нему, например, если он находится в текущем рабочем каталоге:

from subprocess import call

rc = call("./sleep.sh")

если скрипт не имеет shebang то вам нужно указать shell=True:

rc = call("./sleep.sh", shell=True)

если скрипт не имеет исполняемых разрешений и вы не можете измените его, например, запустив os.chmod('sleep.sh', 0o755) затем вы можете прочитать скрипт в виде текстового файла и передать строку в subprocess модуль вместо:

with open('sleep.sh', 'rb') as file:
    script = file.read()
rc = call(script, shell=True)

убедитесь в том, что sleep.sh имеет разрешения на выполнение, и запустить его с shell=True:

#!/usr/bin/python

import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"

Если кто-то ищет вызов скрипта с аргументами

import subprocess

val = subprocess.check_call("./script.sh '%s'" % arg,   shell=True)

Не забудьте преобразовать args в строку перед передачей, используя str (arg).

Это может быть использовано для передачи столько аргументов, сколько требуется

subprocess.check_call("./script.ksh %s %s %s" % (agr1, str(arg2), arg3),   shell=True)

добавление ответа, потому что я был направлен сюда после того, как спросил, как запустить скрипт bash из python. Вы получаете сообщение об ошибке OSError: [Errno 2] file not found Если ваш скрипт принимает параметры. Допустим, например, ваш скрипт взял параметр времени сна:subprocess.call("sleep.sh 10") не будет работать, вы должны передать его в виде массива:subprocess.call(["sleep.sh", 10])

Если chmod не работает, то вы также пытаетесь

import os
os.system('sh script.sh')
#you can also use bash instead of sh

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

Comments

    Ничего не найдено.