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