如果以文件位置的路径 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))
,因此其他解决方案也解决了这个问题。
在 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))
,因此其他解决方案也解决了这个问题。