3

When I'm using Python 3 to launch a program via subprocess.call(), why do I need 4 backslashes in paths?

This is my code:

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

cmd = shlex.split(cmd)

subprocess.call(cmd)

When I examine the command line of the launched cmd.exe instance with Task Manager, it shows the path correctly with only one backslash separating each path.


Because of this, I need this on Windows to make the paths work:

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

is there a more elegant solution?

4

4 回答 4

4

创建字符串时,您需要将每个反斜杠加倍以进行转义,然后当字符串传递到您的 shell 时,您需要再次将每个反斜杠加倍。您可以使用原始字符串将反斜杠减半:

cmd = r'C:\\Windows\\System32\\cmd.exe'
于 2013-11-01T02:43:43.103 回答
4

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

您使用常规字符串而不是原始字符串 ( r"...") 说明了另一个需要双反斜杠的级别,并且 2*2 = 4. QED ;-)

这在 Windows 上运行良好:

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

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

于 2013-11-01T03:09:07.043 回答
2

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

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

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

于 2013-11-01T02:42:39.660 回答
0

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

通常你会使用 \servername\share\

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

你也可以使用 subprocess.call()

import subprocess as sp
sp.call(['c:\\program files\\<path>'])
于 2013-11-01T02:52:51.297 回答