Python os.path.isdir为点返回true

时间:2017-10-06 15:04:44

标签: python windows shell os.path

我在python中编写自己的shell。现在我正在尝试将cd命令实现到我的shell。

执行此命令的函数有几个变量:

self.current_dir = "C:\\" - 默认值,它的变化取决于使用cd命令的用户输入

dir = "..." - 用户键入的请求目录。 “...”是导致问题的输入的示例。

这是我的代码:

def command_cd(self, dir):
    if os.path.isdir(self.shell.current_dir + dir):
        self.shell.current_dir = self.shell.current_dir + dir + "\\"

问题在于,出于某种奇怪的原因,当用户键入点时,os.path.isdir(self.shell.current_dir + dir)会返回True(就像我上面给出的变量的示例输入一样)。

即使你改变点数(甚至超过5点)也会出现问题,我真的不知道是什么原因造成的。

显然没有名为...的文件夹或类似的文件夹。

如果我的问题不够明确,请发表评论并对其进行编辑

2 个答案:

答案 0 :(得分:2)

.是当前目录,..是父目录,并且没有任何大于两个点的引用。

但是,os.path.isdir()返回True的原因是因为python将大于两个点的所有内容都注册为一个点。

import os

print(os.path.abspath(".......") == os.path.abspath("."))
print(os.path.abspath("....") == os.path.abspath("."))

# and that
print(os.path.samefile('......', '.'))
# also prints True

他们将全部打印为True,因为............指向同一位置。

正如chepner在评论中指出的那样,这个问题在POSIX系统中不会发生,而它是由os.stat错误地将'....''.'等同起来的(事实并非如此) ,见后面的编辑)

重要编辑:

eriksun评论:

  

通过调用os.path.isdir来实现Windows GetFileAttributes,   它调用NtQueryAttributesFile。像所有文件系统功能一样   首先,它必须将DOS路径转换为本机NT路径。到了   内核"."".."只是普通名称,因此运行时库   首先必须通过函数规范化路径   RtlGetFullPathName_Ustr也被os.path.abspath使用,所以。{1}}   结果是类似的。它减少两个点以上的方式   最终组件中的尾随空格是继承自DOS的遗留。   它正在尽力模仿20世纪80年代的OS

因此这个问题与python本身无关,因为在Windows cmd中也会出现此问题,cd c:\.....cd .\....\.. Windows仍然可以通过引用两个以上来逃避它点有点。因为它是从DOS继承的,将两个以上的点减少为一个并删除尾随空格。

答案 1 :(得分:0)

这是因为现代计算机上的目录结构中的.指向当前目录。同样,..指向当前目录的父目录。因此,您可以通过在Windows cmd中键入cd ..\..\来导航目录结构中的两个文件夹。这不是一个错误,这是一个功能!我现在无权访问Windows计算机,但cd ...在我的Ubuntu 17.10笔记本电脑上返回错误bash: cd: ...: No such file or directory。任何大于2的点都会得到相同的错误。如果python为True返回...,那就是一个错误。我会在你的cd命令中添加一些不允许输入超过2个点的子句,或者使4个点上升2个目录,6个点3个目录等等。