浏览器不显示文件夹
利用Windows的Python 3.4.2我要与当前运行脚本的这样的文件夹,打开资源管理器:浏览器不显示文件夹
import os, subprocess
subprocess.check_call(['explorer', os.path.dirname(__file__)])
相反,我看到该探险家被打开了默认文件夹 “C:\用户\ XX \文件”,并抛出一个错误:
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
回报与Windows斜杠(反斜杠是路径分隔符),你的路径可以复制并粘贴到探险家,它会打开位置很好。 (XXX是路径部分,YYY是文件名部分)
此外,如果您手动编辑路径(因为它在浏览器中有反斜杠),即使这样命令也会失败。
subprocess.check_call(['explorer', r'C:\Users'])
但至少Explorer将打开正确的目录,尽管抛出了同样的错误的(所以也许使用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])
subprocess.check_call
引发一个例外,如果该过程的返回码是非零。即使浏览器实际上没有错误,它也有一个非零的返回状态,所以你会得到一个异常。
虽然这实际上与问题无关。问题在于你正在向浏览器传递正斜杠的字符串。如果您调用脚本python path/to/script.py
而不是python path\to\script.py
,就会发生这种情况。如果您将绝对路径传递给subprocess.call,则explorer将在正确的目录中打开。如果您将一个空字符串作为第二个参数传递给subprocess.call,则会得到相同的错误。
您需要在您的路径中使用反斜杠来解除它们。在命令行测试,这个工程:
> explorer C:\Users
但这并不
> explorer C:/Users
使用os.path.normpath
到前转换成斜线斜线回
注意abspath
,根据到文档,实现为normpath(join(os.getcwd(), path))
,所以另一种解决方案也解决了这个问题。
谢谢。 'abspath'和'normpath'都会转换斜杠并解决问题(除了非正常的退出代码),而'dirname'('split')并不关心它得到哪种类型的斜线。 ('print(os.path.dirname(r'C:\ Users'))'给出'C:\\'和'print(os.path.dirname(r'C:/ Users'))'给出'C :/')。 – Trilarion
_“你正在传递一个空字符串”_不同意'Command'['explorer','C:/ XXX']'返回的非零出口的错误信息... – Eric
应用'os.path .abspath(__ file __)'并使用'subprocess.call'而不是'subprocess.check_call'修复了我的问题。谢谢。然而,这不是因为路径是空的(不是),而是因为'abspath'将斜杠转换为反斜杠。即使然后浏览器的非正常退出代码仍然存在,但只要它显示正确的文件夹,我不会抱怨... – Trilarion
@Trilarion和埃里克你们两个都是完全正确的;我已经更新了我的答案。我欺骗了自己,因为如果你发送空字符串,你会得到相同的症状。大笨笨的我。 –