Uruchamianie skryptu bash z poziomu Pythona

Mam problem z następującym kodem:

CallBash.py:

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

Sleep.sh:

sleep 10

Chcę, aby" koniec " został wydrukowany po 10s. (wiem, że to głupi przykład, mógłbym po prostu spać w Pythonie, ale to proste sleep.sh plik był tylko testem)

Author: user1638145, 2012-12-06

7 answers

Tworzenie sleep.sh wykonywalny i dodanie shell=True do listy parametrów (jak sugerowano w poprzednich odpowiedziach) Działa ok. W zależności od ścieżki wyszukiwania może być również konieczne dodanie ./ lub innej odpowiedniej ścieżki. (IE, Zmień "sleep.sh" na "./sleep.sh".)

Parametr shell=True nie jest potrzebny (w systemie Posix, takim jak Linux), Jeśli pierwsza linia skryptu bash jest ścieżką do powłoki; na przykład #!/bin/bash.

 55
Author: James Waldby - jwpat7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-06 14:42:00

W zasadzie wystarczy dodać argument shell=True:

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

Ale uważaj -

Ostrzeżenie wywołanie powłoki systemowej z shell = True może stanowić zagrożenie bezpieczeństwa w połączeniu z niezaufanym wejściem. Szczegółowe informacje można znaleźć w ostrzeżeniu Pod często używanymi argumentami.

Źródło

 23
Author: zenpoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-06 14:35:52

Jeśli sleep.sh mA shebang #!/bin/sh i ma odpowiednie uprawnienia do pliku -- run {[6] } aby się upewnić i jest w $PATH wtedy twój kod powinien działać tak jak jest:

import subprocess

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

Jeśli skrypt nie znajduje się w ścieżce, podaj pełną ścieżkę do niego, np. jeśli znajduje się w bieżącym katalogu roboczym:

from subprocess import call

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

Jeśli skrypt nie ma shebanga to musisz podać shell=True:

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

Jeśli skrypt nie ma uprawnień wykonywalnych i nie można go zmienić np. uruchamiając os.chmod('sleep.sh', 0o755) to może odczytać skrypt jako plik tekstowy i przekazać ciąg znaków do modułu subprocess:

with open('sleep.sh', 'rb') as file:
    script = file.read()
rc = call(script, shell=True)
 20
Author: jfs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-14 21:35:09

Upewnij się, że sleep.sh ma uprawnienia wykonawcze i uruchom go za pomocą shell=True:

#!/usr/bin/python

import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"
 5
Author: Adam Matan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-06 14:28:11

Jeśli ktoś szuka wywołania skryptu z argumentami

import subprocess

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

Pamiętaj, aby przekonwertować args na string przed przekazaniem, używając str (arg).

To może być użyte, aby przekazać tyle argumentów, ile jest wymagane

subprocess.check_call("./script.ksh %s %s %s" % (agr1, str(arg2), arg3),   shell=True)
 2
Author: Ponmudi VN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-12 08:22:55

Dodanie odpowiedzi, ponieważ zostałem skierowany tutaj po zapytaniu, jak uruchomić skrypt bash z Pythona. Otrzymasz błąd OSError: [Errno 2] file not found jeśli skrypt przyjmie parametry. Powiedzmy na przykład, że Twój skrypt wziął parametr czasu uśpienia: subprocess.call("sleep.sh 10") nie zadziała, musisz przekazać go jako tablicę: subprocess.call(["sleep.sh", 10])

 1
Author: Matthew Lang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-08 16:04:19

Jeśli chmod nie działa to również spróbuj

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

test by me thanks

 0
Author: Harry1992,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-06 05:40:56