При использовании 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(), а источник строк либо не создан пользователем, либо, по крайней мере, введенный доверенным пользователем (мной).