由于正斜杠,我无法让进程在Windows中正确打开目录

2024-06-28 19:25:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要使用subprocess.Popen打开一个带有路径的资源管理器窗口(仅在Windows中),但我使用的路径有正斜杠,这不起作用,只打开一个通用的PC资源管理器窗口。如果我手动用反斜杠替换它们,效果很好,但是我需要在一个可变路径上实现这一点

我尝试使用os.path.dirname来“规范化”路径,但这也不起作用。瞧,这段代码只提供了通用的PC资源管理器窗口:

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中使用它,而且我不可能让正斜杠不进来,因为我是从用外部程序创建的文件中读取的)

我很感谢大家提供的帮助——不过,让我来澄清一下。路径行来自我无法控制的外部文件。所以它看起来总是像带有正斜杠的示例,无论我如何尝试,它都无法打开explorer子进程(包括下面给出的示例)

但是,如果我只是手动为路径提供反斜杠,它确实可以工作。所以,我需要的是一些东西,将转换为一个反斜杠路径正斜杠。到目前为止,这里所说的一切都不管用


Tags: path路径oswindows手动selectsomefile资源管理
2条回答

可以肯定,这与“正向斜杠”无关,而是由其他几个关于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”(缩写为formatted string literals

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

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

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

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

这看起来像是你想做的,但做得不对

您似乎遇到的另一个问题是“转义序列”和字符串。在编写代码时,反斜杠被写为'\\',但这只是解析后的单个字符。例如,使用:

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

将只打印出:D:\SomePath\Somefile。这个变量也可以很好地处理上述Popen调用

r前缀禁用这个转义处理,它是为“正则表达式”(或“regexp”设计的,请参见^{} Python module)。有很多关于这方面的文章,希望我写的一些文章包含一些谷歌理解的关键字

使用pathlib模块

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

这也适用于subprocess

相关问题 更多 >