当我使用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)
有更优雅的解决方案吗?
答案 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>'])