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 10 sekundach. (Wiem, że to głupi przykład, mógłbym po prostu spać w Pythonie, ale ten prosty plik sleep.sh był tylko testem)
Odpowiedzi:
Uruchamianie sleep.sh i dodanie
shell=True
do listy parametrów (jak sugerowano w poprzednich odpowiedziach) działa poprawnie. W zależności od ścieżki wyszukiwania może być konieczne dodanie./
lub innej odpowiedniej ścieżki. (Tj. Zmień"sleep.sh"
na"./sleep.sh"
.)shell=True
Parametr nie jest potrzebny (w systemie Linux) Posix jak gdyby pierwsza linia skryptu bash jest ścieżka do powłoki; na przykład#!/bin/bash
.źródło
Jeśli
sleep.sh
ma shebang#!/bin/sh
i ma odpowiednie uprawnienia do plików - uruchom,chmod u+rx sleep.sh
aby upewnić się, że jest w$PATH
środku, a Twój kod powinien działać tak, jak jest:Jeśli skryptu nie ma w PATH, podaj pełną ścieżkę do niego, np. Jeśli znajduje się w bieżącym katalogu roboczym:
Jeśli skrypt nie ma shebang, musisz określić
shell=True
:Jeśli skrypt nie ma uprawnień do wykonywania i nie możesz go zmienić, np. Uruchamiając,
os.chmod('sleep.sh', 0o755)
możesz przeczytać skrypt jako plik tekstowy isubprocess
zamiast tego przekazać ciąg do modułu:źródło
Właściwie wystarczy dodać
shell=True
argument:Ale strzeż się -
źródło
źródło
sleep.sh
nie ma go wPATH
. A jeśli jest na ścieżce i ma prawidłowy huk, nie potrzebujeszshell=True
. Zobacz moją odpowiedźJeśli ktoś szuka wywołania skryptu z argumentami
Pamiętaj, aby przekonwertować argumenty na łańcuchy przed przekazaniem, używając str (arg).
Można tego użyć do przekazania dowolnej liczby argumentów:
źródło
Upewnij się, że
sleep.sh
ma uprawnienia do wykonywania i uruchom go zshell=True
:źródło
#!bin/bash
Brakuje błędu w/
.#!/bin/bash
działa tak, jak zaznaczam w odpowiedzi.Jeśli chmod nie działa, spróbuj także
test przeze mnie dzięki
źródło
os.system
Dokumentacja wyraźnie zaleca unikanie go na korzyśćsubprocess
(tych dniachsubprocess.run()
). Jeśli nie możesz dostać sięsubprocess
do pracy, prawdopodobnie będziesz miał również problemyos.system()
.Dodanie odpowiedzi, ponieważ skierowano mnie tutaj po zapytaniu, jak uruchomić skrypt bash z Pythona.
OSError: [Errno 2] file not found
Jeśli twój skrypt przyjmuje parametry, pojawia się błąd . Powiedzmy na przykład, że Twój skrypt przyjął parametr czasu uśpienia:subprocess.call("sleep.sh 10")
nie zadziała, musisz przekazać go jako tablicę:subprocess.call(["sleep.sh", 10])
źródło
shell=True
ale tak, zazwyczaj unikanie tego jest najlepszą grą.