为什么我在Python路径中需要4个反斜杠?

时间:2013-11-01 02:39:58

标签: python list subprocess shlex

当我使用Python 3通过subprocess.call()启动程序时,为什么我需要在路径中使用4个反斜杠?

这是我的代码:

cmd = 'C:\\\\Windows\\\\System32\\\\cmd.exe'

cmd = shlex.split(cmd)

subprocess.call(cmd)

当我使用任务管理器检查已启动的cmd.exe实例的命令行时,它会正确显示路径,每条路径只分隔一个反斜杠。


因此,我需要在Windows上使用此方法来实现路径:

if platform.platform().startswith('Windows'):
    cmd = cmd.replace(os.sep, os.sep + os.sep)

有更优雅的解决方案吗?

4 个答案:

答案 0 :(得分:4)

在创建字符串时,需要将每个反斜杠加倍以进行转义,然后在将字符串传递给shell时,需要再次对每个反斜杠加倍。您可以使用原始字符串将反斜杠调整为一半:

cmd = r'C:\\Windows\\System32\\cmd.exe'

答案 1 :(得分:3)

部分问题在于您正在使用shlex,它实现了Unix-ish shell使用的转义规则。但是你在Windows上运行,其命令shell使用不同的规则。这说明需要加倍反斜杠的一个级别(即,你不需要开始的shlex之外的蠕虫)。

你正在使用常规字符串而不是原始字符串(r"...")占另一个需要加倍反斜杠的级别,并且2 * 2 = 4. QED; - )

这适用于Windows:

cmd = subprocess.call(r"C:\Windows\System32\cmd.exe")

顺便说一句,请仔细阅读subprocess.Popen()的文档:Windows CreateProcess() API调用需要参数的字符串。当您传递序列时,Python会尝试通过文档中解释的规则将该序列转换为字符串。在可行的情况下,最好 - 在Windows上 - 直接传递你想要的字符串。

答案 2 :(得分:2)

\具有特殊含义 - 您将其用作转义序列的一部分。加倍反斜杠,你有一个字面反斜杠\

需要注意的是,只有一对转义反斜杠,你仍然只有一个字面反斜杠。你也需要转义那个反斜杠。

或者,为什么不使用os.sep呢?您将能够确保您的代码更具可移植性(因为它将使用特定于系统的分隔符),并且您不必[直接]处理转义反斜杠。

答案 3 :(得分:0)

正如约翰所指出的,在本地访问文件时不需要4个斜杠。 需要4个斜杠的地方是通过SMB或CIFS连接到(通常是Windows)服务器时。

通常你只需要使用\ servername \ share \

但是这些斜杠中的每一个都需要被转义。因此,在服务器名称之前有4个斜杠。

你也可以使用subprocess.call()

import subprocess as sp
sp.call(['c:\\program files\\<path>'])