当前位置:  开发笔记 > 编程语言 > 正文

如何在Python中更改目录(cd)?

如何解决《如何在Python中更改目录(cd)?》经验,为你挑选了9个好方法。

cd 如在shell命令中更改工作目录.

如何在Python中更改当前的工作目录?



1> Michael Labb..:

您可以使用以下命令更改工作目录:

import os

os.chdir(path)

使用此方法时,有两个最佳做法:

    在无效路径上捕获异常(WindowsError,OSError).如果抛出异常,请不要执行任何递归操作,尤其是破坏性操作.它们将在旧路上运行而不是新路径.

    完成后返回旧目录.这可以通过将chdir调用包装在上下文管理器中以异常安全的方式完成,就像Brian M. Hunt在他的回答中所做的那样.

更改子进程中的当前工作目录不会更改父进程中的当前工作目录.对于Python解释器也是如此.您无法使用os.chdir()更改调用进程的CWD.


我认为这是交互式shell中最简单的方法.请注意,在Windows中,您必须使用正斜杠,例如`os.chdir("C:/ path/to/location")`
[cdunn2001](/sf/ask/17360801/)的轻量级[基于装饰的答案](/sf/ask/17360801/)是现代Python的理想方法.以上答案说明了原因.**除非你认为你知道自己在做什么,否则永远不要在上下文管理器之外调用`os.chdir()`.(_你可能不会._)

2> Brian M. Hun..:

以下是更改工作目录的上下文管理器示例.它比其他地方引用的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.



3> Evan Fosmark..:

我会用os.chdir这样的:

os.chdir("/path/to/change/to")

顺便说一下,如果你需要弄清楚你当前的路径,请使用os.getcwd().

更多这里



4> cdunn2001..:

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'.


**辉煌!**如果[接受的答案](/sf/ask/17360801/)的介绍性评论被注入_this_答案,这将是无法理解的.尽管如此,这个答案的简洁,Python安全的实现保证了我必须给予的所有支持.
另外,请注意[这个潜在的错误](http://stackoverflow.com/a/15427892)(忘记`try/finally`).
为什么"屈服"而不是"回归"?这应该是发电机吗?

5> Brian Clappe..:

如果您使用的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)


**依赖性很差.**Python的内置`contextlib.contextmanager`装饰器很好.请参阅[cdunn2001](/sf/ask/17360801/)的[基于装饰的答案](/sf/ask/17360801/),理想情况下是接受的答案现在.

6> mrdiskodave..:

正如其他人已经指出的那样,上述所有解决方案只会改变当前进程的工作目录.当您退回到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")


**疯狂,脆弱的黑客获得强制性的支持.**没有人应该这样做,尤其是那个"如果用户在运行时打字......"需要注意.尽管如此,它还是反驳了我的反叛领带,看到改变父母的CWD _is_ sort-of,但不是真的可行.Upvotes!支持所有人!

7> PEZ..:

os.chdir()是Pythonic版本的cd.



8> Federico A. ..:

os.chdir() 是正确的方法.



9> Yauhen Yakim..:

进一步指向Brian指出的方向并基于sh(1.0.8+)

from sh import cd, ls

cd('/tmp')
print ls()

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有