2015-08-28 143 views
2

利用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脚本文件的文件夹?

回答

3

您需要通过调用os.path.abspath并将check_callcall(如您怀疑的那样)发送目录的绝对路径。

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,则会得到相同的错误。

+0

_“你正在传递一个空字符串”_不同意'Command'['explorer','C:/ XXX']'返回的非零出口的错误信息... – Eric

+0

应用'os.path .abspath(__ file __)'并使用'subprocess.call'而不是'subprocess.check_call'修复了我的问题。谢谢。然而,这不是因为路径是空的(不是),而是因为'abspath'将斜杠转换为反斜杠。即使然后浏览器的非正常退出代码仍然存在,但只要它显示正确的文件夹,我不会抱怨... – Trilarion

+0

@Trilarion和埃里克你们两个都是完全正确的;我已经更新了我的答案。我欺骗了自己,因为如果你发送空字符串,你会得到相同的症状。大笨笨的我。 –

3

您需要在您的路径中使用反斜杠来解除它们。在命令行测试,这个工程:

> explorer C:\Users 

但这并不

> explorer C:/Users 

使用os.path.normpath到前转换成斜线斜线回


注意abspath,根据到文档,实现为normpath(join(os.getcwd(), path)),所以另一种解决方案也解决了这个问题。

+0

谢谢。 'abspath'和'normpath'都会转换斜杠并解决问题(除了非正常的退出代码),而'dirname'('split')并不关心它得到哪种类型的斜线。 ('print(os.path.dirname(r'C:\ Users'))'给出'C:\\'和'print(os.path.dirname(r'C:/ Users'))'给出'C :/')。 – Trilarion

相关问题