Możesz też zadzwonić do nich przez subprocess
moduł, ale ...
W przypadku Pythona 2.7 i nowszych po prostu użyj
subprocess.check_call(['open', filename])
W Pythonie 3.5+ możesz równoważnie użyć nieco bardziej złożonego, ale też nieco bardziej wszechstronnego
subprocess.run(['open', filename], check=True)
Jeśli chcesz zachować zgodność aż do Pythona 2.4, możesz użyć subprocess.call()
i zaimplementować własne sprawdzanie błędów:
try:
retcode = subprocess.call("open " + filename, shell=True)
if retcode < 0:
print >>sys.stderr, "Child was terminated by signal", -retcode
else:
print >>sys.stderr, "Child returned", retcode
except OSError, e:
print >>sys.stderr, "Execution failed:", e
Jakie są zalety używania subprocess
?
- Bezpieczeństwo: Teoretycznie jest to bezpieczniejsze, ale w rzeczywistości musimy wykonać wiersz poleceń w taki czy inny sposób; W każdym środowisku potrzebujemy środowiska i usług do interpretacji, uzyskiwania ścieżek i tak dalej. W żadnym przypadku nie wykonujemy dowolnego tekstu, więc nie ma on nieodłącznego
'filename ; rm -rf /'
problemu „ale możesz wpisać ”, a jeśli nazwa pliku może być uszkodzona, użycie nie subprocess.call
daje nam dodatkowej ochrony.
- Obsługa błędów: tak naprawdę nie daje nam więcej możliwości wykrywania błędów, nadal polegamy na
retcode
obu przypadkach; ale zachowanie polegające na jawnym zgłaszaniu wyjątku w przypadku błędu z pewnością pomoże ci zauważyć, jeśli wystąpi awaria (chociaż w niektórych scenariuszach śledzenie może wcale nie być bardziej pomocne niż po prostu zignorowanie błędu).
- Odradza podproces (nieblokujący) : nie musimy czekać na proces potomny, ponieważ zgodnie z opisem problemu rozpoczynamy oddzielny proces.
Na zastrzeżenie „Ale subprocess
jest preferowane”. Jednak os.system()
nie jest przestarzałe i jest w pewnym sensie najprostszym narzędziem do tego konkretnego zadania. Wniosek: używanie os.system()
jest zatem również poprawną odpowiedzią.
Znaczącą wadą jest to, że start
polecenie systemu Windows wymaga przejścia, shell=True
co neguje większość korzyści wynikających z używania subprocess
.