如何使用Python pathlib更改目录

Luk*_*kas 17 python pathlib

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

让我们假设我创建一个Path对象如下:

from pathlib import Path
path = Path('/etc')
Run Code Online (Sandbox Code Playgroud)

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

import os
os.chdir(str(path))
Run Code Online (Sandbox Code Playgroud)

Luk*_*kas 15

基于这些评论,我意识到这pathlib无助于更改目录,如果可能,应该避免目录更改.

因为我需要从正确的目录中调用Python之外的bash脚本,所以我选择使用上下文管理器来更清楚地更改类似于这个答案的目录:

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)
Run Code Online (Sandbox Code Playgroud)

一个很好的选择是使用该答案cwd中的subprocess.Popen类的参数.

如果您使用的是Python <3.6并且path实际上是一个pathlib.Path,则需要str(path)chdir语句中使用.

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

Yan*_*ong 5

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

os。chdir(路径)将当前工作目录更改为path。

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

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

在版本3.6中更改:接受类似路径的对象

import os
from pathlib import Path

path = Path('/etc')
os.chdir(path)
Run Code Online (Sandbox Code Playgroud)

这可能会在将来的项目中提供帮助,这些项目不必与3.5或更低版本兼容。