При использовании os.system () часто необходимо избегать имен файлов и других аргументов, передаваемых командам в качестве параметров. Как я могу это сделать? Желательно что-то, что работало бы в нескольких операционных системах / оболочках, но, в частности, для bash.
В настоящее время я делаю следующее, но уверен, что для этого должна быть функция библиотеки или, по крайней мере, более элегантный / надежный / эффективный вариант:
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)))
Изменить: я принял простой ответ об использовании кавычек, не знаю, почему я не подумал об этом; Наверное, потому что я пришел из Windows, где 'и' ведут себя немного иначе.
Что касается безопасности, я понимаю проблему, но в этом случае меня интересует быстрое и простое решение, которое предоставляет os.system (), а источник строк либо не создается пользователем, либо, по крайней мере, вводится доверенный пользователь (я).
sh_escape
функция могла бы избежать ;
пробелов и и устранить проблему безопасности, просто создав файл с именем вроде foo.txt\;\ rm\ -rf\ /
.