2015-08-28 139 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

相關問題