gpt4 book ai didi

Python os.path.isdir 为点返回 true

转载 作者:可可西里 更新时间:2023-11-01 11:45:29 25 4
gpt4 key购买 nike

我正在用 python 编写自己的 shell。现在我正在尝试对我的 shell 执行 cd 命令。

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

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 个点)也会出现问题,我真的不知道是什么原因造成的。

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

如果我的问题不够清楚请评论我会修改

最佳答案

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

但是,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 评论:

Windows os.path.isdir is implemented by calling GetFileAttributes, which calls NtQueryAttributesFile. Like all file system functions, first it has to convert the DOS path to a native NT path. To the kernel "." and ".." are just normal names, so the runtime library first has to normalize the path via the function RtlGetFullPathName_Ustr, which also gets used by os.path.abspath, so the result is similar. The way it reduces more than two dots and trailing spaces in the final component is a legacy inherited from DOS. It's doing its best to emulate an OS from the 1980s.

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

关于Python os.path.isdir 为点返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46608731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com