Запуск скрипта bash из python
у меня проблема со следующим кодом:
callBash.py:
import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
sleep.sh:
sleep 10
Я хочу, чтобы" конец " был напечатан после 10 С. (Я знаю, что это глупый пример, я мог бы просто спать в python, но это просто sleep.sh файл был просто как тест)
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и он имеет соответствующие права доступа к файлам -- runchmod 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