chciałbym spróbować czegoś takiego:
#!/usr/bin/python
from __future__ import print_function
import shlex
from subprocess import Popen, PIPE
def shlep(cmd):
'''shlex split and popen
'''
parsed_cmd = shlex.split(cmd)
## if parsed_cmd[0] not in approved_commands:
## raise ValueError, "Bad User! No output for you!"
proc = Popen(parsed_command, stdout=PIPE, stderr=PIPE)
out, err = proc.communicate()
return (proc.returncode, out, err)
... Innymi słowy niech shlex.split() zrobić większość prac. NIE próbowałbym parsować wiersza poleceń powłoki, wyszukiwać operatorów rur i konfigurować własnego potoku. Jeśli masz zamiar to zrobić, będziesz musiał napisać pełny parser składni powłoki, a skończysz robiąc strasznie dużo kanalizacji.
Oczywiście pojawia się pytanie, dlaczego nie wystarczy użyć POPEN z powłoką = true opcji (słowo kluczowe)? To pozwoli ci przekazać ciąg (bez dzielenia i analizowania) do powłoki i nadal zbierać wyniki do obsługi, jak chcesz. Mój przykład tutaj nie przetwarza żadnych potoków, odsunięć, przekierowań deskryptorów plików itp., Które mogą znajdować się w poleceniu, wszystkie pojawią się jako argumenty dosłowne w poleceniu. W związku z tym jest jeszcze bezpieczniej niż działa z shell = True ...Podałem głupi przykład sprawdzenia polecenia w odniesieniu do jakiegoś słownika lub zestawu "zatwierdzonych poleceń" - przez to bardziej sensownym byłoby normalizowanie go na ścieżce absolutnej, chyba że masz zamiar wymagać, aby argumenty były normalizowane przed przekazywanie ciągu poleceń do tej funkcji.
* subprocess.call() * może być użyty do odczytu/err. [sprawdź instrukcję] (http://docs.python.org/2/library/subprocess.html). upewnij się, że polecenie nie generuje dużej ilości danych wyjściowych. – tuxuday