Os.system () kullanılırken genellikle dosya adlarından ve komutlara parametre olarak geçirilen diğer argümanlardan kaçınmak gerekir. Bunu nasıl yapabilirim? Tercihen birden çok işletim sistemi / kabuk üzerinde ama özellikle bash için çalışacak bir şey.
Şu anda aşağıdakileri yapıyorum, ancak bunun için bir kitaplık işlevi veya en azından daha zarif / sağlam / verimli bir seçenek olması gerektiğinden eminim:
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)))
Düzenleme: Alıntı kullanmanın basit cevabını kabul ettim, neden bunu düşünmediğimi bilmiyorum; Sanırım Windows'dan geldiğim için 've "biraz farklı davranıyorum.
Güvenlikle ilgili olarak endişeyi anlıyorum, ancak bu durumda os.system () 'in sağladığı hızlı ve kolay bir çözümle ilgileniyorum ve dizelerin kaynağı ya kullanıcı tarafından oluşturulmamış ya da en azından bir güvenilen kullanıcı (ben).
sh_escape
işlev, ;
ve boşluklarından kaçabilir ve basitçe benzeri bir şey olarak adlandırılan bir dosya oluşturarak güvenlik sorununu ortadan kaldırabilir foo.txt\;\ rm\ -rf\ /
.