【问题标题】:Documentation describing this python windows os.chdir behavior?描述此 python windows os.chdir 行为的文档?
【发布时间】:2018-07-19 22:59:53
【问题描述】:

我今天了解到,在 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:\

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

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

【问题讨论】:

  • 这不是 Python 功能,而是 Windows 功能。在Windows上,每个驱动器都有自己的工作目录,所以F:表示F盘的当前工作目录,而`F:\`表示F盘的根目录。
  • 另外,它并不特定于chdir。如果你open('F:spam.txt'),你会在 F 的当前工作目录上得到spam.txt,但open('F:\\spam.txt') 你会在 F 的根目录上得到spam.txt
  • 这是 Windows 功能。而且 Python 的文档是跨平台的,所以关于它可能运行的操作系统的大部分细节都没有讨论。
  • @abarnert:这 2 个 cmets 是一个很好的答案——尤其是第一个。 (除了“我可以依靠它不改变吗”,我的意思是谁能知道微软将在他们新宣布的“改进”控制台中打破什么。)

标签: python chdir


【解决方案1】:

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

在 Windows 上,每个驱动器都会跟踪自己的当前工作目录。所以说真的,“当前工作目录”就是当前驱动器的当前工作目录。

  • 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 一样做事——它给你更多的灵活性,而且通常不会那么混乱。


正如您在评论中添加的那样:

除了“我可以依靠它不改变吗”之外,我的意思是谁能知道微软将在他们新宣布的“改进”控制台中打破什么。

嗯,这种行为可以追溯到……我认为是 PC-DOS 2.0,或者他们第一次添加目录的时候。如果他们想要改进这一点,他们可能会通过摆脱驱动和路径来实现更灵活或更类似于 POSIX 的东西。 (尽管 UNC 路径和\\.\…“原始”路径可以说已经更灵活且更类似于 POSIX,但它们在 NT 中添加这些路径时并没有摆脱驱动器和目录系统......)

【讨论】:

  • cd f: 评论很到位。我没有想到在命令提示符下尝试 cd f: 来查看它不会更改 cwd。我很高兴 os.chdir 在参数不适用于当前驱动器的情况下的行为与 cd 不同,因为那会令人难以置信地令人沮丧......
【解决方案2】:

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

请注意,由于每个驱动器都有一个当前目录,os.path.join("c:", "foo") 表示相对于驱动器 C: (c:foo) 上当前目录的路径,而不是 c:\foo

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

但是,the comment by abarnert 是正确的。该行为是由 Windows 解释路径的方式引起的。

【讨论】:

  • 太棒了——文档的链接很棒。
  • @aggieNick02 太好了。很高兴我能帮上忙。
猜你喜欢
  • 1970-01-01
  • 2015-12-10
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
相关资源
最近更新 更多