Під час використання 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\ /
.