描述此 python windows os.chdir 行为的文档?

Documentation describing this python windows os.chdir behavior?

我今天了解到,在 windows 的 python 中,os.chdir('f:\')os.chdir('f:') 有很大不同。带有尾部反斜杠的命令实际上更改了当前目录。如果没有反斜杠,该命令就像在命令提示符中键入 f:,并将当前目录更改为 f 驱动器上的最后一个当前目录。

这是一个例子:

import time
import os
if __name__ == '__main__':
    os.chdir('f:\directory')
    print 'cwd is {}'.format(os.getcwd())
    os.chdir('d:\directory')
    print 'cwd is {}'.format(os.getcwd())
    os.chdir('f:')
    print 'cwd is {}'.format(os.getcwd())
    os.chdir('f:\')
    print 'cwd is {}'.format(os.getcwd())

打印

cwd is f:\directory
cwd is d:\directory
cwd is f:\directory
cwd is f:\

我能理解为什么这种差异是有用的,但找不到任何记录这种行为的东西。我习惯于在我的目录中留下尾部斜杠,因为我通常在这里使用字符串...

是否在任何地方记录了此行为?我能指望它不变吗?

文档提到了同一模块中另一个函数的这种行为。假设它们将以相同的方式处理可能是安全的:

Note that since there is a current directory for each drive, os.path.join("c:", "foo") represents a path relative to the current directory on drive C: (c:foo), not c:\foo.

https://docs.python.org/3/library/os.path.html

然而,是正确的。该行为是由 Windows 解释路径的方式引起的。

这不是 Python 功能,它是一般 Windows 功能。

在 Windows 上,每个驱动器都会跟踪自己的当前工作目录。所以真的,"the current working directory" 是当前驱动器的当前工作目录。

  • chdir('F:') 将驱动器更改为 F,但不更改 F 的工作目录,因此您最终更改为 F 的当前目录开车.

  • chdir('F:\') 将驱动器更改为 F,并将 F 的工作目录更改为其根目录,因此您最终更改为根目录F 驱动器。

它也不特定于 chdir。任何处理路径名的函数,甚至 open,都会以这种方式运行。

*open('F:spam.txt') 在 F 驱动器的当前工作目录中打开文件 spam.txt(即使您当前的驱动器是 C)。 (这与 DOS 风格工具的工作方式一致。)

*open('F:\spam.txt')打开F盘根目录下的文件spam.txt


一些跨平台工具试图假装驱动器是顶级挂载点,所以 cd F: 就像 cd /f/,而 F 的根。这样做的好处是使您的程序的本机 Windows 和 Cygwin 版本的工作非常相似,但缺点是使您的程序不像传统的 DOS 风格的程序那样工作。一般来说,更多的工具以 Python 的方式做事——它给你更多的灵活性,而且通常不那么混乱。


正如您在评论中添加的:

Apart from the "Can I rely on it not changing", I mean who can tell what Microsoft will break in their newly announced 'improved' console.

好吧,这种行为可以追溯到……我想是 PC-DOS 2.0,或者当他们第一次添加目录时。如果他们要改进这一点,他们可能会通过摆脱驱动器和路径来实现更灵活或更像 POSIX 的东西。 (虽然 UNC 路径和 \.\… "raw" 路径可以说已经更加灵活并且更像 POSIX,并且他们在添加时并没有摆脱 drive-and-dir 系统那些在北领地...)