如果以文件位置的路径 dirname 启动,Explorer 不显示文件夹

Explorer does not show folder if started with path dirname of file location

在 Windows 上使用 Python 3.4.2 我想用当前 运行 脚本的文件夹打开资源管理器,如下所示:

import os, subprocess
subprocess.check_call(['explorer', os.path.dirname(__file__)])

相反,我看到资源管理器是使用默认文件夹打开的 "C:\Users\XX\Documents" 并抛出错误:

Traceback (most recent call last):
  File "C:/XXX/YYY.py", line 9, in <module>
    subprocess.check_call(['explorer', os.path.dirname(__file__)])
  File "C:\Python34\lib\subprocess.py", line 561, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['explorer', 'C:/XXX']' returned non-zero exit status 1

虽然 os.path.dirname returns 路径在 Windows 上带有斜杠(反斜杠是路径分隔符),但您可以将其复制并粘贴到资源管理器中,它会很好地打开该位置。 (XXX为路径部分,YYY为文件名部分)

此外,如果您在资源管理器中手动写入路径(带反斜杠),即使这样命令也会失败。

subprocess.check_call(['explorer', r'C:\Users'])

但至少浏览器会打开正确的目录,尽管会抛出相同的错误(因此可能使用 call 而不是 check_call)。

这是怎么回事?如何在资源管理器中显示 运行 Python 脚本文件的文件夹?

您需要通过调用 os.path.abspath 发送目录的绝对路径,并将 check_call 切换为 call(如您所料)。

import os
import subprocess
dirname = (os.path.dirname(os.path.abspath(__file__)))
subprocess.call(['explorer', dirname])
如果进程的 return 代码不为零,

subprocess.check_call 会引发异常。即使资源管理器实际上没有错误,它也有一个非零的 return 状态,所以你会得到一个异常。

虽然这实际上与问题无关。问题是您将带有正斜杠的字符串传递给资源管理器。如果您像 python path/to/script.py 而不是 python path\to\script.py 这样调用脚本,就会发生这种情况。如果您将 绝对路径 传递给 subprocess.call,资源管理器将在正确的目录中打开。如果将空字符串作为第二个参数传递给 subprocess.call.

,则会出现相同的错误

您需要在路径中使用反斜杠,windows 资源管理器才能理解它们。从命令行测试,这有效:

> explorer C:\Users

但这不是

> explorer C:/Users

使用os.path.normpath将正斜杠转换为反斜杠


请注意,根据文档,abspath 实现为 normpath(join(os.getcwd(), path)),因此其他解决方案也解决了这个问题。