由于正斜杠,我无法正确打开 Windows 中的目录

I can't get process to correctly open up the directory in Windows due to forward slashes

我需要使用 subprocess.Popen 打开带有路径的资源管理器 window(仅在 Windows 中),但我使用的路径有正斜杠,而这没有'不起作用,只能打开一个通用的 PC 资源管理器 window。如果我手动用反斜杠替换它们,它就可以正常工作,但我需要在可变路径中发生这种情况。

我尝试使用 os.path.dirname 来 "normalize" 路径,但这也不起作用。 IOW,这段代码只给我通用的 PC 资源管理器 window:

myRoot = "D:/SomePath/Somefile"
subprocess.Popen(r'explorer /select, myRoot')

甚至:

myRoot = "D:/SomePath/Somefile"
subprocess.Popen(r'explorer /select, os.path.abspath(myRoot)')

但这行得通:

myRoot = "D:\SomePath\Somefile"
subprocess.Popen(r'explorer /select, myRoot')

我也试过手动替换那些正斜杠字符串,但无论我尝试了多少种方法,我都无法得到它(显然做错了什么)。有什么线索吗? (我只需要它在 Windows 中工作,而且我无法让正斜杠不进入,因为我正在从使用外部程序创建的文件中读取)。

我很感激人们试图提供的帮助——尽管如此,让我试着澄清一下。路径的行来自我无法控制的外部文件。所以它总是看起来像带有正斜杠的示例,无论我如何尝试它都无法打开资源管理器子进程(包括下面给出的示例)。

但是,如果我只是手动提供带有反斜杠的路径,它确实有效。所以我需要的是将正斜杠路径转换为反斜杠路径的东西。到目前为止,这里的任何建议都没有用。

使用路径库模块。

from pathlib import Path
myRoot = Path("D:/path/to/wherever")

这也适用于 subprocess

很确定这与 "forward slashes" 无关,而是由其他一些关于 Python 的工作方式以及命令参数如何从一个进程传递到另一个进程的混淆引起的。

myRoot = "D:/SomePath/Somefile"
subprocess.Popen(rf'explorer /select, {os.path.abspath(myRoot)}')

有效,因为 Python 变量已扩展为传递给 Popen 的字符串,这相当于:

cmdline = rf'explorer /select, {os.path.abspath(myRoot)}'
subprocess.Popen(cmdline)

也等同于:

cmdline = 'explorer /select, {root}'.format(
    root=os.path.abspath(myRoot))
subprocess.Popen(cmdline)

字符串的 f 前缀称为 "f-string" (short for formatted string literals)

如果您 print(cmdline) 您会看到它已扩展为: "explorer /select, D:/SomePath/Somefile" 因此路径可以到达 MS Explorer 进程。

当您 运行 Popen(r'explorer /select, myRoot') 时,myRoot 变量没有展开,因此 Explorer 只能看到它可能忽略的文本 "myRoot"

推荐的替代方法是将 list 传递给 Popen,每个元素都是一个单独的命令行参数。例如:

Popen(['explorer', '/select', myRoot])

哪一类看起来像你正在尝试做,但没有做对。

您似乎遇到的另一个问题是 "escape sequences" 和字符串。当您编写代码时,反斜杠写为 '\' 但这只是解析后的单个字符。例如,使用:

myRoot = "D:\SomePath\Somefile"
print(myRoot)

只会打印出:D:\SomePath\Somefile。这个变量也应该与上面的 Popen 调用一起工作。

r 前缀禁用此转义处理,并且专为 "regular expressions"(或 "regexp"s,请参阅 re Python module)设计。有很多关于此的文章,希望我写的一些文章包含一些 Google 理解的关键工作。