Podczas korzystania z os.system () często konieczne jest uniknięcie nazw plików i innych argumentów przekazywanych jako parametry do poleceń. W jaki sposób mogę to zrobić? Najlepiej coś, co działałoby na wielu systemach operacyjnych / powłokach, ale w szczególności na bash.
Obecnie wykonuję następujące czynności, ale jestem pewien, że musi to być funkcja biblioteczna lub przynajmniej bardziej elegancka / solidna / wydajna opcja:
def sh_escape(s):
return s.replace("(","\\(").replace(")","\\)").replace(" ","\\ ")
os.system("cat %s | grep something | sort > %s"
% (sh_escape(in_filename),
sh_escape(out_filename)))
Edycja: zaakceptowałem prostą odpowiedź, używając cytatów, nie wiem, dlaczego o tym nie pomyślałem; Chyba dlatego, że pochodzę z systemu Windows, gdzie „i” zachowują się trochę inaczej.
Jeśli chodzi o bezpieczeństwo, rozumiem obawy, ale w tym przypadku interesuje mnie szybkie i łatwe rozwiązanie, które zapewnia os.system (), a źródło ciągów nie jest generowane przez użytkownika lub przynajmniej wprowadzane przez zaufany użytkownik (ja).
sh_escape
funkcja wymknęłaby ;
spacje i i usunęłaby problem bezpieczeństwa, po prostu tworząc plik o nazwie coś podobnego foo.txt\;\ rm\ -rf\ /
.