繁体   English   中英

使用上下文管理器sh.cd

[英]sh.cd using context manager

这是我基本上想做的事情:

import sh, os

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

print os.getcwd()

我虽然收到以下错误

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

我在这里想念什么? 是否有其他解决方案可在上下文中更改目录?

您不能只使用任何类/函数作为上下文管理器,实际上必须通过在函数上使用contextlib.contextmanager装饰器或在类的情况下,通过定义__enter____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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM