Odpowiedzi:
Podproces moduł będzie pomóc.
Rażąco trywialny przykład:
>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0
>>>
Gdzie test.sh
jest prosty skrypt powłoki i 0
jego wartość zwracana dla tego uruchomienia.
chmod +x script.sh
. Uwaga: skrypt.sh jest symbolem zastępczym skryptu, zamień go odpowiednio.
Istnieje kilka sposobów korzystania z os.popen()
(przestarzałych) lub całego subprocess
modułu, ale takie podejście
import os
os.system(command)
jest jednym z najłatwiejszych.
subprocess
możesz zarządzać rurami wejścia / wyjścia / błędów. Jest to również lepsze, gdy masz wiele argumentów - os.command()
będziesz musiał utworzyć całą linię poleceń ze znakami specjalnymi, z subprocess
prostą listą argumentów. Ale dla prostych zadań os.command()
może być po prostu wystarczające.
The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
Jeśli chcesz przekazać pewne parametry do skryptu powłoki, możesz użyć metody shlex.split () :
import subprocess
import shlex
subprocess.call(shlex.split('./test.sh param1 param2'))
zw test.sh
tym samym folderze:
#!/bin/sh
echo $1
echo $2
exit 0
Wyjścia:
$ python test.py
param1
param2
import os
import sys
Zakładając, że test.sh to skrypt powłoki, który chciałbyś wykonać
os.system("sh test.sh")
Użyj modułu podprocesu, jak wspomniano powyżej.
Używam tego w ten sposób:
subprocess.call(["notepad"])
Korzystam z języka Python 3.5 i subprocess.call (['./ test.sh']) nie działa dla mnie.
Daję ci trzy rozwiązania, w zależności od tego, co chcesz zrobić z produktem.
1 - skrypt wywołania. Zobaczysz wyjście w swoim terminalu. wyjście jest liczbą.
import subprocess
output = subprocess.call(['test.sh'])
2 - wywołanie i zrzut zrzutu oraz błąd w łańcuch. Nie zobaczysz wykonania w swoim terminalu, dopóki nie wydrukujesz (standardowe wyjście). Shell = Prawda, ponieważ argument w Popen nie działa dla mnie.
import subprocess
from subprocess import Popen, PIPE
session = subprocess.Popen(['test.sh'], stdout=PIPE, stderr=PIPE)
stdout, stderr = session.communicate()
if stderr:
raise Exception("Error "+str(stderr))
3 - wywołaj skrypt i zrzuć polecenia echa temp.txt w pliku temp_file
import subprocess
temp_file = open("temp.txt",'w')
subprocess.call([executable], stdout=temp_file)
with open("temp.txt",'r') as file:
output = file.read()
print(output)
Nie zapomnij rzucić okiem na podproces dokumentu
Moduł podprocesu jest dobrym modułem do uruchamiania podprocesów. Możesz go użyć do wywoływania poleceń powłoki w następujący sposób:
subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)
Możesz zobaczyć jego dokumentację tutaj.
Jeśli masz skrypt napisany w pliku .sh lub długim ciągu, możesz użyć modułu os.system. Jest to dość proste i łatwe do wywołania:
import os
os.system("your command here")
# or
os.system('sh file.sh')
To polecenie uruchomi skrypt raz, do końca, i zablokuje, dopóki nie zakończy działania.
W przypadku, gdy skrypt ma wiele argumentów
#!/usr/bin/python
import subprocess
output = subprocess.call(["./test.sh","xyz","1234"])
print output
Dane wyjściowe podadzą kod statusu. Jeśli skrypt uruchomi się pomyślnie, da 0 w przeciwnym razie liczbę całkowitą niezerową.
podname=xyz serial=1234
0
Poniżej znajduje się skrypt powłoki test.sh.
#!/bin/bash
podname=$1
serial=$2
echo "podname=$podname serial=$serial"
Podproces jest dobry, ale niektórzy ludzie mogą bardziej lubić skrypty . Skrypty mają więcej zestawów metod wysokiego poziomu, takich jak shell.call (args) , path.rename (nowa_nazwa) i path.move (src, dst) . Skrypty oparte są na podprocesie i innych.
Dwie wady skryptu:
Wiem, że jest to stara sprawa, ale natknąłem się niedawno i skończyło się misguiding mnie od podproces API jak zmieniło od Pythona 3.5.
Nowym sposobem wykonywania zewnętrznych skryptów jest run
funkcja, która uruchamia polecenie opisane przez args. Czeka na wykonanie polecenia, a następnie zwraca instancję CompletedProcess.
import subprocess
subprocess.run(['./test.sh'])