Python os.path.isdir为圆点返回true

我在python编程自己的shell。 现在我试图执行cd命令到我的shell。

执行这个命令的函数有几个variables:

self.current_dir = "C:\\" – 默认值,它的改变取决于用户使用cd命令的input

dir = "..." – 用户input的请求目录。 “…”是引起问题的input的示例。

这是我的代码:

 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)在用户input点时返回True (就像上面给出的variables的示例input一样)。

即使你改变点的数量(即使在5点以上)也会出现这个问题,我真的不知道是什么原因造成的。

显然没有文件夹命名...或类似的东西。

如果我的问题不够清楚,请发表评论,我会编辑它

    . 是当前目录, ..是父目录,没有任何超过两个点的引用。

    但是, 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 

    他们都将打印真实,因为............ 指向同一个地方。


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


    重要编辑:

    eriksun评论道:

    Windows os.path.isdir通过调用GetFileAttributes实现, GetFileAttributes调用NtQueryAttributesFile 。 像所有文件系统函数一样,首先必须将DOS路径转换为本地NT路径。 给内核"."".."只是普通名称,所以运行时库首先必须通过函数RtlGetFullPathName_Ustr来规范路径,这个函数也被os.path.abspath ,所以结果是相似的。 减少最终组件中多于两个点和尾随空格的方式是从DOS继承的遗留方式。 从20世纪80年代开始,它正在尽力模拟一个OS

    因此,这个问题与python本身无关,因为这个问题也发生在Windows cmd以及cd c:\.....cd .\....\.. Windows将仍然让你逃避,通过参考两个点与一个点。 因为它是从DOS继承来减少两个以上的点到一个并删除尾随空格。

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