为什么这个dos命令在python中不起作用?

时间:2010-01-20 15:24:14

标签: python subprocess

我尝试将一些dos命令从我的批处理文件移动到python但是得到此错误,文件名,目录名或卷标语法不正确,对于以下语句。

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

如果我只是将dos命令复制到窗口控制台中,它就可以了。 os.getcwd()给了我预期的工作目录。

我的问题是: 那是为什么? 2.如何避免?我是否需要获取当前工作目录并为该命令构造一个抽象路径?怎么做?

感谢

4 个答案:

答案 0 :(得分:12)

\(反斜杠)是字符串常量中的转义字符,因此您的字符串最终会更改。在字符串常量中使用双\ s(如此\\):

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

答案 1 :(得分:9)

我的建议是尽量不要不必要地使用系统命令。您正在使用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你可以从文档中看一下。

答案 2 :(得分:7)

你有未转义的反斜杠。您可以使用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)

答案 3 :(得分:2)

你不能一对一地复制它。例如,您的转义字符()变得不正确。在这种情况下,你可能需要一个双\。

此外,还有用于创建和终止目录的特定API调用,请查看os.path