Jak wykonać polecenia powłoki w Python za pomocą metody uruchomienia podprocesowego

Jak wykonać polecenia powłoki w Python za pomocą metody uruchomienia podprocesowego
Podprocess to wbudowany moduł Python, którego można użyć do tworzenia nowych procesów i interakcji z ich strumieniami danych wejściowych i wyjściowych. Mówiąc prosto, możesz go użyć do uruchamiania poleceń powłoki i uruchamiania plików binarnych wykonywalnych zwykle rozproszonych w różnych folderach „bin” w systemie plików Linux. Możesz także podać pełną ścieżkę do pliku plik wykonywalnego i użyć dowolnych przełączników wiersza poleceń powiązanych z binarnym. W tym artykule wyjaśniono, jak korzystać z modułu podprocesowego i jego metody uruchomienia w aplikacjach Python. Wszystkie próbki kodu w artykule są testowane z Python 3.8.2 na Ubuntu 20.04.

Podproces.Metoda uruchamiania

Podproces.Metoda uruchamiania ma listę argumentów. Po wywołaniu metody wykonuje polecenie i czeka na zakończenie procesu, zwracając na końcu obiekt „Completed Process”. Obiekt „CompletedProcess” zwraca stdout, stdderr, oryginalne argumenty używane podczas wywoływania metody oraz kod powrotu. Stdout odnosi się do strumienia danych wyprodukowanych przez polecenie, podczas gdy STDDERR odnosi się do wszelkich błędów podniesionych podczas wykonywania programu. Każdy niezerowy kod zwrotny (kod wyjściowy) oznaczałby błąd z poleceniem wykonanym w podproces.Metoda uruchamiania.

Przykład 1: Wyjście zawartość pliku tekstowego za pomocą podproces.Metoda uruchamiania

Poniższe polecenie wyświetli zawartość „danych.plik txt ”, zakładając, że zawiera ciąg„ name = John ”.

importować podproces
podproces.RUN ([„cat”, „dane.tekst"])

Uruchomienie powyższego kodu zwróci następujące dane wyjściowe:

Nazwa = John
CompleteDProcess (args = [„cat”, „dane.txt '], returnCode = 0)

Pierwszym elementem argumentu listy jest nazwa polecenia, które ma zostać wykonane. Każdy element na liście, który następuje Pierwszy element, są uważane za opcje lub przełączniki wiersza poleceń. Możesz również użyć pojedynczej descy rozdzielczej i podwójnej atrakcji, aby zdefiniować opcje. Na przykład, aby wymienić pliki i foldery w katalogu, kod byłby „podproces.Run ([„LS”, „-l”] ”. W większości tych przypadków możesz rozważyć dowolny argument oddzielony przestrzenią w poleceniu powłoki jako indywidualny element na liście dostarczonej do podproces.Metoda uruchamiania.

Przykład 2: Stłumij wyjście podproces.Metoda uruchamiania

Aby stłumić wyjście podproces.Metoda uruchomienia, będziesz musiał dostarczyć „stdout = podproces.DevNull ”i„ Stderr = podproces.DevNull ”jako dodatkowe argumenty.

importować podproces
podproces.RUN ([„cat”, „dane.txt "], stdout = podproces.DevNull,
stderr = podproces.DevNull)

Uruchomienie powyższego kodu wytworzy następujące dane wyjściowe:

CompleteDProcess (args = [„cat”, „dane.txt '], returnCode = 0)

Przykład 3: Wyjście przechwytywania podproces.Metoda uruchamiania

Aby uchwycić wyjście podproces.Metoda Uruchom, użyj dodatkowego argumentu o nazwie „Capture_output = True”.

importować podproces
wyjście = podproces.RUN ([„cat”, „dane.txt "], capture_output = true)
Drukuj (wyjście)

Uruchomienie powyższego kodu wytworzy następujące dane wyjściowe:

CompleteDProcess (args = [„cat”, „dane.txt '], returnCode = 0,
stdout = b'name = John \ n ', stderr = b ")

Możesz indywidualnie uzyskać dostęp do wartości STDOUT i STDERR, używając „wyjściowego.stdout ”i„ wyjście.metody stderr ”. Wyjście jest wytwarzane jako sekwencja bajtów. Aby uzyskać ciąg jako wyjście, użyj „wyjściowego.Stdout.Metoda dekodowania („UTF-8”) ”. Możesz także dostarczyć „text = true” jako dodatkowy argument dla podproces.Uruchom wywołanie, aby uzyskać wyjście w formacie ciągów. Aby uzyskać kod stanu wyjścia, możesz użyć „wyjścia.Metoda returncode ”.

Przykład 4: Podnieś wyjątek dotyczący niepowodzenia polecenia wykonanego przez podproces.Metoda uruchamiania

Aby podnieść wyjątek, gdy polecenie wychodzi ze statusem niezerowym, użyj argumentu „Check = True”.

importować podproces
podproces.RUN ([„cat”, „dane.tx "], capture_output = true, text = true, check = true)

Uruchomienie powyższego kodu wytworzy następujące dane wyjściowe:

Podnieś o nazwieProcessError (kod retcode, proces.Args,
podproces.Zwany ProcesSerror: Command '[' cat ', „dane.tx ']'
zwrócił status wyjścia niezerowego 1.

Przykład 5: Przekaż ciąg do polecenia wykonanego przez podproces.Metoda uruchamiania

Możesz przekazać ciąg do polecenia, który ma zostać wykonany przez podproces.Metoda uruchom za pomocą argumentu „input = 'string'”.

importować podproces
wyjście = podproces.RUN ([„cat”], data input = ".txt ", capture_output = true,
Text = prawda, sprawdź = true)
Drukuj (wyjście)

Uruchomienie powyższego kodu wytworzy następujące dane wyjściowe:

CompleteDProcess (args = ['cat'], returnCode = 0, stdout = 'Dane.txt ', stderr = ")

Jak widać, powyższy kod przekazuje „dane.txt ”jako ciąg, a nie jako obiekt pliku. Przekazać „Dane.txt ”Jako plik użyj argumentu„ stdin ”.

z otwartymi („Dane.txt ") jako f:
wyjście = podproces.RUN ([„cat”], stdin = f, capture_output = true,
Text = prawda, sprawdź = true)
Drukuj (wyjście)

Uruchomienie powyższego kodu wytworzy następujące dane wyjściowe:

CompleteDProcess (args = ['cat'], returnCode = 0, stdout = 'name = John \ n', stderr = ")

Przykład 6: Wykonaj polecenie bezpośrednio w Shell za pomocą podproces.Metoda uruchamiania

Możliwe jest uruchomienie polecenia bezpośrednio w powładzie „tak, jak jest” zamiast używać ciągu podzielonego w poleceniu głównym i opcjach, które go przestrzegają. Aby to zrobić, musisz przekazać „powłok = true” jako dodatkowy argument. Jest to jednak zniechęcone przez programistów Pythona, ponieważ użycie „shell = true” może prowadzić do problemów bezpieczeństwa. Możesz przeczytać więcej o implikacjach bezpieczeństwa stąd.

importować podproces
podproces.Uruchom (dane „cat”.txt '", shell = true)

Uruchomienie powyższego kodu wytworzy następujące dane wyjściowe:

Nazwa = John

Wniosek

Podproces.Metoda biegu w Pythonie jest dość mocna, ponieważ pozwala uruchamiać polecenia powłoki w samym Pythonie. Pomaga to w ograniczeniu całego kodu do samego Pythona bez potrzeby posiadania dodatkowego kodu skryptu w osobnych plikach. Może być jednak dość trudne, aby poprawnie tokenizować polecenia powłoki na liście Python. Możesz użyć „Shlex.split () ”metoda tokenizacji prostych poleceń powłoki, ale w długich, złożonych poleceniach - szczególnie tych z symbolami rur - Shlex nie jest prawidłowo podzielony polecenie. W takich przypadkach debugowanie może być trudnym problemem. Możesz użyć argumentu „shell = true”, aby tego uniknąć, ale istnieją pewne obawy dotyczące bezpieczeństwa związane z tym działaniem.