2014-06-28 24 views
0

這裏是什麼,我基本上是試圖做的事:sh.cd使用情況管理器

import sh, os 

with sh.cd('/tmp'): 
    print os.getcwd() 

print os.getcwd() 

我碰到下面的錯誤,雖然

line 3, in <module> 
    with sh.cd('/tmp'): 
AttributeError: __exit__ 

缺少什麼我在這裏?是否有其他解決方案來更改上下文中的目錄?

+1

有一個在[這個答案](HTTP一個很好的解決方案:// stackoverflow.com/a/13197763/1901786)。 – whereswalden

+0

thx,@whereswalden。我之前做過一些研究,也偶然發現了這個問題。但我想知道是否沒有「短」解決方案。這似乎是一個經常使用的情況。 –

回答

3

您不能僅僅使用任何類/函數作爲上下文管理器,它必須實際上明確地以這種方式實現,使用函數上的contextlib.contextmanager修飾器,或者在類的情況下,通過定義__enter__ and __exit__實例方法。

您正在使用的sh.cd函數就是圍繞os.chdir的包裝:

>>> import sh 
>>> sh.cd 
<bound method Environment.b_cd of {}> 

b_cd定義爲:

def b_cd(self, path): 
    os.chdir(path) 

正如你所看到的,它只是一個正常的功能;它不能用作上下文管理器。

提供的鏈接whereswalden展示了一種實現想要作爲類的行爲的好方法。它可以類似地實現這樣的功能:

import contextlib 
import os 

@contextlib.contextmanager 
def cd(path): 
    old_path = os.getcwd() 
    os.chdir(path) 
    try: 
     yield 
    finally: 
     os.chdir(old_path) 

使用範例:

print(os.getcwd()) 
with cd("/"): 
    print os.getcwd() 
print(os.getcwd()) 

輸出:

'/home/dan' 
'/' 
'/home/dan' 
相關問題