【问题标题】:How can I change directory with Python pathlib如何使用 Python pathlib 更改目录
【发布时间】:2017-06-04 04:23:45
【问题描述】:

使用 Python pathlib (Documentation) 功能更改目录的预期方法是什么?

假设我创建了一个Path 对象,如下所示:

from pathlib import Path
path = Path('/etc')

目前我只知道以下内容,但这似乎破坏了pathlib 的想法。

import os
os.chdir(str(path))

【问题讨论】:

  • 无论如何更改当前目录都不是一个好主意。为什么要换目录?
  • 我想用 Python 重写一个小的 bash 脚本。这样我可以比调用外部 bash 脚本更容易地处理错误。
  • 如果你不需要它,你不必使用pathlib - os.chdir('/etc')
  • 我觉得pathlib 会带来更优雅的代码。不过既然cd一点都不优雅,那我还不如去os.chdir('/etc')
  • @furas;告诉核心开发人员。请参阅 Path.read_bytes 和 Path.read_text。

标签: python pathlib


【解决方案1】:

根据 cmets,我意识到 pathlib 无助于更改目录,应尽可能避免更改目录。

由于我需要从正确的目录调用 Python 之外的 bash 脚本,因此我选择使用上下文管理器来更简洁地更改目录,类似于 answer:

import os
import contextlib
from pathlib import Path

@contextlib.contextmanager
def working_directory(path):
    """Changes working directory and returns to previous on exit."""
    prev_cwd = Path.cwd()
    os.chdir(path)
    try:
        yield
    finally:
        os.chdir(prev_cwd)

一个不错的选择是使用subprocess.Popen 类的cwd 参数,就像在这个answer 中一样。

如果您使用的是 Python path 实际上是 pathlib.Path,则您需要在 chdir 语句中使用 str(path)

【讨论】:

  • 这正是我所需要的!我正在测试一个命令行工具,其所需参数取决于 cwd,因此我需要移动 cwd 以测试此功能。但是,如果我以幼稚的方式编写它,那么当测试失败时,它将引发意外异常并且 cwd 不会被移回,这意味着所有未来的测试都以错误的 cwd 开始并给出无用的错误。使用上下文管理器意味着我知道它会被移回!我认为 try-except-finally 块也是有效的,但是编写上下文管理器更可靠,并且可以在多个测试中保存代码。
【解决方案2】:

在 Python 3.6 或以上版本中,os.chdir() 可以直接处理Path 对象。事实上,Path 对象可以替换标准库中的大多数str 路径。

os.chdir(path) 将当前工作目录改为path。

此函数可以支持指定文件描述符。描述符 必须引用打开的目录,而不是打开的文件。

3.3 版中的新功能:添加了对将路径指定为文件的支持 某些平台上的描述符。

3.6 版更改:接受path-like object

import os
from pathlib import Path

path = Path('/etc')
os.chdir(path)

这可能有助于将来不必与 3.5 或更低版本兼容的项目。

【讨论】:

  • 是的,确实非常好。我希望 Python 社区要么在任何地方接受pathlib.Path,要么完全放弃它。
  • @Lukas:我很想喜欢,但目前无法接受。自从你发表评论以来已经三年了,我怀疑我永远不能……而且 os.path 无论如何都会留下来。如果它可以完全取代 os.path,我可以并且会接受它。问题就在于此。至少对我来说。
  • 自然,这应该是公认的答案。 是的,如果存在假设的成熟 pathlib.Path.chdir() 方法,那么 API 正交性会更好——但这是下一个最好的事情。让我们不要让完美再次成为美好的敌人
【解决方案3】:

如果您不介意使用a third-party library

$ pip install path

然后:

from path import Path

with Path("somewhere"):
    # current working directory is now `somewhere`
    ...
# current working directory is restored to its original value. 

或者如果你想在没有context manager的情况下这样做:

Path("somewhere").cd()
# current working directory is now changed to `somewhere`

【讨论】:

  • 明确一点,这不是标准库 pathlib。与 pathlib.Path('x') 一起使用不会更改目录。
猜你喜欢
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-27
  • 2015-12-18
  • 1970-01-01
  • 2013-06-29
相关资源
最近更新 更多