почему эта команда DOS не работает внутри Python? - PullRequest
3 голосов
/ 20 января 2010

Я пытаюсь переместить некоторую команду dos из моего пакетного файла в python, но получаю эту ошибку, неверный синтаксис имени файла, имени каталога или метки тома для следующего оператора.

subprocess.Popen('rd /s /q .\ProcessControlSimulator\bin', shell=True, 
                  stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

Если я просто скопирую команду dos в консоль окна, она будет работать. Os.getcwd () дал мне ожидаемый рабочий каталог.

Мои вопросы: 1. почему так? 2. как этого избежать? мне нужно получить текущий рабочий каталог и создать абстрактный путь для этой команды? как это сделать?

спасибо

Ответы [ 4 ]

12 голосов
/ 20 января 2010

\ (обратная косая черта) является escape-символом внутри строковых констант, поэтому ваша строка в итоге изменилась. Используйте double \ s (например, \\) в строковых константах:

subprocess.Popen('rd /s /q .\\ProcessControlSimulator\\bin', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
9 голосов
/ 20 января 2010

Мой совет: старайтесь не использовать системные команды без необходимости. Вы используете Python, поэтому используйте доступные модули, которые идут с ним. Из того, что я вижу, вы пытаетесь удалить каталоги правильно? Тогда вы можете использовать модули, такие как Shutil. Пример:

import shutil
import os
path = os.path.join("c:\\","ProcessControlSimulator","bin") #example only
try:
    shutil.rmtree(path)
except Exception,e:
    print e
else:
    print "removed"

есть и другие, такие как os.removedirs, os.remove, на которые вы можете посмотреть из документов.

7 голосов
/ 20 января 2010

У вас есть обратный слэш без экранирования. Вы можете использовать необработанную строку Python, чтобы избежать экранирования или удвоить их:

subprocess.Popen(r'rd /s /q .\ProcessControlSimulator\bin', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

или

subprocess.Popen('rd /s /q .\\ProcessControlSimulator\\bin', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
2 голосов
/ 20 января 2010

Вы не можете просто скопировать его один в один. Например, ваши escape-символы () становятся неправильными. В этом случае вам может понадобиться двойной \ *. 1001 *

Кроме того, есть определенные вызовы API для создания и уничтожения каталогов, смотрите os.path

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...