2016-11-29 6 views
1

В настоящее время я ищу Popen для автоматизации сжатия & хранения документов.Использование subprocess.Popen (shell = True) с папками Windows

Для части сжатия, я думал о следующей строке Python:

subprocess.Popen("WinRAR.exe a -r c:\\03. Notes\\AllTexts *.txt", shell=True) 

Я постоянно имея сообщения об ошибках, так как команда не в состоянии иметь дело с именем папки, которая содержит пробел (03. Notes). Этот вопрос задавался несколько раз, и я должен сказать, что я пробовал все предложения: необработанная строка, двойные кавычки, тройные кавычки ... Ни один из них не работал.

Поскольку я не могу изменить имена папок, и у меня больше нет идей, попросите кого-нибудь сообщить, как я могу успешно передать эту командную строку?

+0

Почему вы используете 'ш ell = True? вообще? Не могли бы вы использовать вызов 'list' (с модулем' glob' для расширения вашего glob) и позволить Python делать необходимые преобразования/экранирование автоматически, не используя 'shell = True'? – ShadowRanger

+0

Нет причин использовать оболочку для этой команды. Используйте список аргументов без оболочки, например. 'subprocess.check_call ([" WinRAR.exe "," a "," -r ", r" C: \ 03. Notes \ AllTexts "," * .txt "])'. – eryksun

+0

Спасибо за этот намек. Check_call имеет большой смысл, поскольку список аргументов намного длиннее, чем в моем примере. Я не знаю, как отметить ваш комментарий, имеет ценный ответ, но это действительно помогло. Это восстановило надежду в моем проекте автоматизации :-) – JCF

ответ

1

В Windows вы должны использовать кавычки для имен файлов или каталогов (если вы хотите использовать пробелы внутри). В Python, вы должны экранировать кавычки с \ символ (если вы используете строки в "кавычках), как это:.

"my name is \"Mark\"!" 

Или просто:

'my name is "Mark"!' 

Так что это будет работать, как ожидалось:

subprocess.Popen("WinRAR.exe a -r \"c:\\03. Notes\\AllTexts\" *.txt", shell=True) 

Как:

subprocess.Popen('WinRAR.exe a -r "c:\\03. Notes\\AllTexts" *.txt', shell=True) 
+0

Использование сырых строк внутри строк - это что-то новое для меня. Я изменил код, и он работал нормально. Спасибо за подсказку. Я попробовал также метод check_call, упомянутый выше eryksun. Сейчас я сравниваю 2 метода. Check_call выглядит немного легче для чтения и менее «предательски» в плане подсчета обратных косых черт. В любом случае, я перешел от «не более идеи к тестированию» в «2 варианта для сравнения» через 6 часов. Большое спасибо. – JCF