由于正斜杠,我无法获得在Windows中正确打开目录的过程

时间:2019-05-03 13:31:44

标签: python process os.path

我需要使用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上才能使用它,而且由于我正在读取使用外部程序创建的文件,因此我无法获得正斜杠。)

我感谢人们正在努力提供的帮助-不过,让我尝试澄清一下。路径的行来自我无法控制的外部文件。因此,它始终看起来像带有正斜杠的示例,无论我如何尝试,它都无法与打开资源管理器子进程一起使用(包括下面给出的示例)。

但是,如果我只是手动为路径提供反斜杠,则它确实起作用。因此,我需要的是将正斜杠路径转换为反斜杠路径的工具。到目前为止,这里没有建议。

2 个答案:

答案 0 :(得分:1)

使用pathlib模块。

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

这也可以与subprocess一起使用

答案 1 :(得分:0)

可以肯定的是,这与“正斜杠”无关,而是由于对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”,请参见re Python module)设计的。关于此的文章很多,希望我写的一些文章包含Google可以理解的一些关键工作。