У меня проблема со следующим кодом:
callBash.py:
import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
sleep.sh:
sleep 10
Я хочу, чтобы «конец» печатался через 10 секунд. (Я знаю, что это глупый пример, я мог бы просто спать в python, но этот простой файл sleep.sh был просто тестом)
Ответы:
Создание исполняемого файла sleep.sh и добавление
shell=True
в список параметров (как было предложено в предыдущих ответах) работает нормально. В зависимости от пути поиска вам также может потребоваться добавить./
или какой-либо другой подходящий путь. (То есть сменить"sleep.sh"
на"./sleep.sh"
.)shell=True
Параметр не нужен ( в рамках системы Posix , как Linux) , если первая строка сценария Баш является путь к оболочке; например#!/bin/bash
,.источник
Если
sleep.sh
есть shebang#!/bin/sh
и соответствующие права доступаchmod u+rx sleep.sh
к файлу - запустите, чтобы убедиться, что он есть,$PATH
тогда ваш код должен работать как есть:Если скрипт отсутствует в PATH, укажите полный путь к нему, например, если он находится в текущем рабочем каталоге:
Если в скрипте нет shebang, необходимо указать
shell=True
:Если у скрипта нет прав на исполнение и вы не можете его изменить, например, запустив его,
os.chmod('sleep.sh', 0o755)
вы можете прочитать скрипт как текстовый файл иsubprocess
вместо этого передать строку в модуль:источник
На самом деле вам просто нужно добавить
shell=True
аргумент:Но будьте осторожны -
источник
источник
sleep.sh
его нет вPATH
. И если он находится на пути и у него правильный шебанг, тогда он вам не нуженshell=True
. См. Мой ответЕсли кто-то ищет вызов скрипта с аргументами
Не забудьте преобразовать аргументы в строку перед передачей, используя str (arg).
Это можно использовать для передачи любого количества аргументов:
источник
Убедитесь, что у
sleep.sh
него есть разрешения на выполнение, и запустите его с помощьюshell=True
:источник
#!bin/bash
отсутствует/
.#!/bin/bash
работает как отмечаю в ответе.Если chmod не работает, попробуйте
тест мной спасибо
источник
os.system
документации специально рекомендуется избегать этого в пользуsubprocess
(в наши дниsubprocess.run()
). Если вы не можете приступитьsubprocess
к работе, скорее всего, у вас тоже будут проблемыos.system()
.Добавление ответа, потому что меня направили сюда после того, как я спросил, как запустить сценарий bash из python. Вы получите сообщение об ошибке,
OSError: [Errno 2] file not found
если ваш скрипт принимает параметры. Скажем, например, ваш скрипт принял параметр времени сна:subprocess.call("sleep.sh 10")
не будет работать, вы должны передать его как массив:subprocess.call(["sleep.sh", 10])
источник
shell=True
но да, обычно избегать этого - ваша лучшая игра.