Igo*_*kin 2 python shell contextmanager
这是我基本上要做的事情:
import sh, os
with sh.cd('/tmp'):
print os.getcwd()
print os.getcwd()
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
line 3, in <module>
with sh.cd('/tmp'):
AttributeError: __exit__
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?是否有替代解决方案来更改上下文中的目录?
你不能只使用任何类/函数作为上下文管理器,它必须实际显式地实现,使用contextlib.contextmanager函数上的装饰器,或者在类的情况下,通过定义__enter__和__exit__实例方法.
sh.cd您正在使用的功能只是一个包装器os.chdir:
>>> import sh
>>> sh.cd
<bound method Environment.b_cd of {}>
Run Code Online (Sandbox Code Playgroud)
b_cd 定义为:
def b_cd(self, path):
os.chdir(path)
Run Code Online (Sandbox Code Playgroud)
如你所见,它只是一个正常的功能; 它不能用作上下文管理器.
提供的链接whereswalden显示了实现您想要作为一个类的行为的好方法.它可以类似地实现为这样的函数:
import contextlib
import os
@contextlib.contextmanager
def cd(path):
old_path = os.getcwd()
os.chdir(path)
try:
yield
finally:
os.chdir(old_path)
Run Code Online (Sandbox Code Playgroud)
样品用法:
print(os.getcwd())
with cd("/"):
print os.getcwd()
print(os.getcwd())
Run Code Online (Sandbox Code Playgroud)
输出:
'/home/dan'
'/'
'/home/dan'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1040 次 |
| 最近记录: |