При использовании 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\ /
. - person Tom   schedule 07.10.2010