我需要使用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子进程(包括下面给出的示例)
但是,如果我只是手动为路径提供反斜杠,它确实可以工作。所以,我需要的是一些东西,将转换为一个反斜杠路径正斜杠。到目前为止,这里所说的一切都不管用
可以肯定,这与“正向斜杠”无关,而是由其他几个关于Python如何工作以及命令参数如何从一个进程到另一个进程的混淆引起的
工作,因为Python变量已扩展为传递给
Popen
的字符串,这相当于:也相当于:
字符串的
f
前缀称为“f-string”(缩写为formatted string literals)如果你
print(cmdline)
,你会看到它被扩展到:"explorer /select, D:/SomePath/Somefile"
因此路径可以到达MS Explorer进程运行
Popen(r'explorer /select, myRoot')
时,myRoot
变量没有展开,因此资源管理器只看到它可能忽略的文本"myRoot"
建议的替代方法是将
list
传递给Popen
,每个元素都是一个单独的命令行参数。例如:这看起来像是你想做的,但做得不对
您似乎遇到的另一个问题是“转义序列”和字符串。在编写代码时,反斜杠被写为
'\\'
,但这只是解析后的单个字符。例如,使用:将只打印出:
D:\SomePath\Somefile
。这个变量也可以很好地处理上述Popen
调用r
前缀禁用这个转义处理,它是为“正则表达式”(或“regexp”设计的,请参见^{使用pathlib模块
这也适用于
subprocess
相关问题 更多 >
编程相关推荐