我在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点)也会出现问题,我真的不知道是什么原因造成的。
显然没有名为...
的文件夹或类似的文件夹。
如果我的问题不够明确,请发表评论并对其进行编辑
答案 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
来实现WindowsGetFileAttributes
, 它调用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个目录等等。