Quando si usa os.system () è spesso necessario sfuggire ai nomi dei file e ad altri argomenti passati come parametri ai comandi. Come posso fare questo? Preferibilmente qualcosa che funzioni su più sistemi operativi / shell, ma in particolare per bash.
Attualmente sto facendo quanto segue, ma sono sicuro che ci deve essere una funzione di libreria per questo, o almeno un'opzione più elegante / robusta / efficiente:
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)))
Modifica: ho accettato la semplice risposta di usare le virgolette, non so perché non ci ho pensato; Immagino perché vengo da Windows dove "e" si comportano in modo leggermente diverso.
Per quanto riguarda la sicurezza, capisco la preoccupazione, ma, in questo caso, sono interessato a una soluzione semplice e veloce fornita da os.system () e la fonte delle stringhe non è generata dall'utente o almeno inserita da un utente fidato (io).
sh_escape
funzione ideale sarebbe sfuggire agli ;
spazi e e rimuovere il problema di sicurezza semplicemente creando un file chiamato qualcosa di simile foo.txt\;\ rm\ -rf\ /
.