Причина поведения UNIX shell=True
связана с цитированием. Когда мы пишем команду оболочки, она будет разбита на пробелы, поэтому мы должны привести некоторые аргументы:
cp "My File" "New Location"
Это приводит к проблемам, когда наши аргументы содержат кавычки, которые требует ускорения:
grep -r "\"hello\"" .
Иногда мы можем получить ужасные ситуации , где \
тоже нужно сбежать!
Конечно, реальная проблема в том, что мы пытаемся использовать строку one для указания строк multiple . При вызове системных команд большинство языков программирования избегают этого, позволяя нам в первую очередь отправлять несколько строк, следовательно:
Popen(['cp', 'My File', 'New Location'])
Popen(['grep', '-r', '"hello"'])
Иногда бывает неплохо запускать «необработанные» команды оболочки; например, если мы скопируем что-то из сценария оболочки или веб-сайта, и мы не хотим конвертировать все ужасное экранирование вручную. Вот почему существует опция shell=True
:
Popen(['cp "My File" "New Location"'], shell=True)
Popen(['grep -r "\"hello\"" .'], shell=True)
Я не знаком с Windows, поэтому я не знаю, как и почему она ведет себя по-другому.