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)
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
.
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.
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)
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"
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)
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])
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
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