cd
如在shell命令中更改工作目录.
如何在Python中更改当前的工作目录?
您可以使用以下命令更改工作目录:
import os
os.chdir(path)
使用此方法时,有两个最佳做法:
在无效路径上捕获异常(WindowsError,OSError).如果抛出异常,请不要执行任何递归操作,尤其是破坏性操作.它们将在旧路上运行而不是新路径.
完成后返回旧目录.这可以通过将chdir调用包装在上下文管理器中以异常安全的方式完成,就像Brian M. Hunt在他的回答中所做的那样.
更改子进程中的当前工作目录不会更改父进程中的当前工作目录.对于Python解释器也是如此.您无法使用os.chdir()
更改调用进程的CWD.
以下是更改工作目录的上下文管理器示例.它比其他地方引用的ActiveState版本更简单,但这可以完成工作.
cd
import os class cd: """Context manager for changing the current working directory""" def __init__(self, newPath): self.newPath = os.path.expanduser(newPath) def __enter__(self): self.savedPath = os.getcwd() os.chdir(self.newPath) def __exit__(self, etype, value, traceback): os.chdir(self.savedPath)
或者使用ContextManager尝试更简洁的等价物(下面).
import subprocess # just to call an arbitrary command e.g. 'ls' # enter the directory like this: with cd("~/Library"): # we are in ~/Library subprocess.call("ls") # outside the context manager we are back wherever we started.
我会用os.chdir
这样的:
os.chdir("/path/to/change/to")
顺便说一下,如果你需要弄清楚你当前的路径,请使用os.getcwd()
.
更多这里
cd()
使用生成器和装饰器很容易编写.
from contextlib import contextmanager import os @contextmanager def cd(newdir): prevdir = os.getcwd() os.chdir(os.path.expanduser(newdir)) try: yield finally: os.chdir(prevdir)
然后,即使抛出异常,该目录也会被还原:
os.chdir('/home') with cd('/tmp'): # ... raise Exception("There's no place like home.") # Directory is now back to '/home'.
如果您使用的Python的一个相对较新的版本,你也可以使用一个上下文管理器,比如这一个:
from __future__ import with_statement from grizzled.os import working_directory with working_directory(path_to_directory): # code in here occurs within the directory # code here is in the original directory
UPDATE
如果你喜欢自己动手:
import os from contextlib import contextmanager @contextmanager def working_directory(directory): owd = os.getcwd() try: os.chdir(directory) yield directory finally: os.chdir(owd)
正如其他人已经指出的那样,上述所有解决方案只会改变当前进程的工作目录.当您退回到Unix shell时,这会丢失.如果绝望,你可以用这个可怕的黑客改变Unix上的父shell目录:
def quote_against_shell_expansion(s): import pipes return pipes.quote(s) def put_text_back_into_terminal_input_buffer(text): # use of this means that it only works in an interactive session # (and if the user types while it runs they could insert characters between the characters in 'text'!) import fcntl, termios for c in text: fcntl.ioctl(1, termios.TIOCSTI, c) def change_parent_process_directory(dest): # the horror put_text_back_into_terminal_input_buffer("cd "+quote_against_shell_expansion(dest)+"\n")
os.chdir()
是Pythonic版本的cd
.
os.chdir()
是正确的方法.
进一步指向Brian指出的方向并基于sh(1.0.8+)
from sh import cd, ls cd('/tmp') print ls()