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

时间:2018-07-19 22:59:53

标签: python chdir

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

我可以理解为什么这种区别有用,但是找不到任何记录这种行为的记录。我已经习惯于在目录中留下斜线,因为我通常在这里使用字符串...

此行为是否记录在任何地方?我可以依靠它不变吗?

2 个答案:

答案 0 :(得分:6)

这不是Python功能,而是Windows的常规功能。

在Windows上,每个驱动器均会跟踪其当前的工作目录。因此,实际上,“当前工作目录”是当前驱动器的当前工作目录。

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

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

它也不特定于F。任何处理路径名的函数,甚至是chdir,都将以这种方式起作用。

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

* spam.txt在F驱动器的根目录中打开文件open('F:\\spam.txt')


某些跨平台工具试图假装驱动器是顶级安装点,因此spam.txt就像cd F:,而 does 转到{ {1}}。这具有使程序的本机Windows版本和Cygwin版本工作非常相似的优点,但是使程序无法像传统DOS风格的程序一样工作的缺点。通常,更多的工具可以像Python一样处理事情-它为您提供了更大的灵活性,并且通常不会造成混乱。


您在评论中添加的内容:

  

除了“我可以依靠它而不改变”之外,我的意思是谁可以说出微软在其新发布的“改进”控制台中将打破什么。

好吧,这种行为可以回溯到……我认为PC-DOS 2.0或它们首次添加目录时都会出现。而且,如果他们要改善这一点,则可以通过摆脱驱动器路径来实现,以实现更灵活或更像POSIX的功能。 (尽管UNC路径和cd /f/“原始”路径已经可以说更灵活且更像POSIX,并且在NT中添加驱动器和目录系统时也没有摆脱它们)。 / p>

答案 1 :(得分:4)

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

  

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

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

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