在python中实现pushd

在python中实现pushd,python,operating-system,yield,chdir,pushd,Python,Operating System,Yield,Chdir,Pushd,我试图理解下面是如何实现Unix命令pushd的。具体来说,如果yield命令不产生任何结果,那么yield命令的用途是什么 @contextmanager def pushd(path): prev = os.getcwd() os.chdir(path) try: yield finally: os.chdir(prev) 根据wikipedia的说法,“pushd命令将当前工作目录保存在内存中,以便可以随时返回,也可以选择更

我试图理解下面是如何实现Unix命令pushd的。具体来说,如果yield命令不产生任何结果,那么yield命令的用途是什么

@contextmanager
def pushd(path):
    prev = os.getcwd()
    os.chdir(path)
    try:
        yield
    finally:
        os.chdir(prev)

根据wikipedia的说法,“pushd命令将当前工作目录保存在内存中,以便可以随时返回,也可以选择更改为新目录”。此代码块的哪个部分执行此定义中的哪些功能

要理解这段代码,您必须理解为什么使用@contextmanager decorator。它允许您在with语句中使用一些函数,它将为您处理上下文。所以,您希望在某个目录中执行某些操作,然后跳回—您的操作在您跳入的目录上下文中是有意义的。因此,此函数的用例如下所示:

In [4]: os.chdir('/var')                                                                                                                                                                     

In [5]: os.getcwd()                                                                                                                                                                          
Out[5]: '/var'

In [6]: with pushd('/etc'): 
   ...:     print(os.getcwd()) 
   ...:                                                                                                                                                                                      
/etc

In [7]: os.getcwd()                                                                                                                                                                          
Out[7]: '/var'
正如您所看到的-一个目录在带有block的内部已更改为/etc,但在这之后它又返回到/var,类似于popd行为

本例中的yield是上下文管理器decoratorapi的一部分,在本例中它不需要返回任何内容。它用于类似的结构

with open('my_file.txt') as file:
   do_something_with_file(file)
您实际上需要一些资源来处理内部上下文

有关本模块目标的更多信息,请参阅文档