Jak wywołać skrypt powłoki z kodu python?


Odpowiedzi:


252

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.shjest prosty skrypt powłoki i 0jego wartość zwracana dla tego uruchomienia.


11
Uwaga: lepiej jest przekazać subprocess.call () listę niż ciąg znaków (patrz przykład dla Hugo24 poniżej, aby zapoznać się z przykładem i przyczynami).
Jim Dennis,

1
Link do samouczka jest uszkodzony.
Kshitij Saraogi

6
Daje to: OSError: [Errno 13] Odmowa dostępu. mój skrypt nie musi działać z sudo. @Manoj Govindan
alper

6
Z argumentami: subprocess.call (['./ test.sh', 'param1', 'param2'])
Henry

2
@alper przejdź do folderu w którym został umieszczony skrypt i uruchom polecenie chmod +x script.sh. Uwaga: skrypt.sh jest symbolem zastępczym skryptu, zamień go odpowiednio.
Tom J Muthirenthi

105

Istnieje kilka sposobów korzystania z os.popen()(przestarzałych) lub całego subprocessmodułu, ale takie podejście

import os
os.system(command)

jest jednym z najłatwiejszych.


1
dlaczego nie jest to najbardziej pozytywna odpowiedź? Czy nie trzeba importować modułu, co jest lepszym rozwiązaniem? To musi być jakaś wada?
boulder_ruby

6
Za pomocą subprocessmoż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 subprocessprostą listą argumentów. Ale dla prostych zadań os.command() może być po prostu wystarczające.
Michał Niklas

1
Cytat z tego linku:The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
Maximilian

42

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.shtym samym folderze:

#!/bin/sh
echo $1
echo $2
exit 0

Wyjścia:

$ python test.py 
param1
param2

To jest eleganckie.
caleb

20
import os
import sys

Zakładając, że test.sh to skrypt powłoki, który chciałbyś wykonać

os.system("sh test.sh")

15

Użyj modułu podprocesu, jak wspomniano powyżej.

Używam tego w ten sposób:

subprocess.call(["notepad"])

13
Uwaga: wywołanie podprocesu z listą jest bezpieczniejsze, ponieważ nie wymaga przepuszczania (potencjalnie niezarządzanego) ciągu przez powłokę w celu parsowania / interpretacji. Pierwszym elementem na liście będzie plik wykonywalny, a wszystkie pozostałe elementy zostaną przekazane jako argumenty.
Jim Dennis

13

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


1
Uwaga Nie używaj stdout = PIPE lub stderr = PIPE z subprocess.call. Proces potomny zostanie zablokowany, jeśli wygeneruje wystarczającą moc wyjściową do potoku, aby wypełnić bufor potoku systemu operacyjnego, ponieważ rury nie są odczytywane.

4

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.


Nie musisz też importować sys?
ScottyBlades,

Nie, ty nie; spróbuj otworzyć powłokę Pythona i uruchomić ten fragment kodu
Kartezjusza

4

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"


2

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 runfunkcja, która uruchamia polecenie opisane przez args. Czeka na wykonanie polecenia, a następnie zwraca instancję CompletedProcess.

import subprocess

subprocess.run(['./test.sh'])

1

Jeśli plik skryptu powłoki nie ma uprawnień do wykonywania, zrób to w następujący sposób.

import subprocess
subprocess.run(['/bin/bash', './test.sh'])

-9

Wypróbuj następujące kody:

Import Execute 

Execute("zbx_control.sh")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.