python是否有一个简单的函数来检查目录是否是一个实际目录,或者它只是另一个目录的别名?我正在尝试列出目录中的所有文件/文件夹,但由于这些别名文件夹,我得到的东西看起来像这样:
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bundle/Home/bundle/Home/bundle/Home/bundle/Home/bundle/Home/bundle/Home/bundle/Home/捆绑/主页/束/主页/束/主页/束
我知道我可以编写一个比较路径并退出的函数,如果它好像我要进入圆圈,但是有一个简单的函数可以完全按照我不知道的那样做吗?
例如。
os.isAlias( …pathname… )
谢谢!
答案 0 :(得分:3)
这是os.path.realpath
的一个版本,适用于Mac别名以及Python 2下的符号链接 :
from Carbon import File
def osx_realpath (path):
return File.FSResolveAliasFile(path, True)[0].as_pathname()
如果在递归之前在每个目录上调用osx_realpath,则应避免重复。或者,您可以定义类似
的内容def is_osx_realpath (path):
return path == osx_realpath(path)
但是,你必须担心漏报。如果你过滤is_osx_realpath并且你开始的路径是别名,你的程序将停止而不看任何东西。
到目前为止,我还不知道如何在Python 3下执行此操作。我有一个问题here,我希望得到答案。现在,我不能比使用subprocess.call invoke something that does the check on the command line更好。
编辑:我应该补充一点,不仅在Python 3中没有Carbon.File,而且它已被弃用,因此最好在Python 2中避免 - 但它是我所知道的最实用的解决方案目前用于Python 2。
编辑2:这是一种检查文件是否是我认为对Python 3友好的别名的方法。但是,我没有代码来解析别名。我相信你需要安装PyObjC。
from AppKit import NSWorkspace
def is_alias (path):
uti, err = NSWorkspace.sharedWorkspace().typeOfFile_error_(
os.path.realpath(path), None)
if err:
raise Exception(unicode(err))
else:
return "com.apple.alias-file" == uti
(source)
答案 1 :(得分:1)
上面的答案是不正确的。 虽然Finder确实将符号链接作为别名报告,但它们是不同的东西。
符号链接是UNIX的基本功能,但别名是仅限Apple的功能。 如果您怀疑这会创建一个目录和别名的符号链接。符号链接通常为50-100字节,而别名可以是几MB。
os.path.islink( … )
会报告符号链接,但不会报告别名。
我不确定如何在Python中找到它们,但以下链接显示了其他方法。
答案 2 :(得分:0)
您可以在Mac OS X中检查文件或目录是否为GetFileInfo
命令的别名。GetFileInfo -aa foo
使用" 1"打印一行。如果foo是别名而且" 0"如果没有。
import subprocess
def is_alias(path):
return subprocess.check_output(["GetFileInfo", "-aa", path]) == "1\n"
似乎有点伤感产卵的过程,每检查,但我想这样的作品与Mac OS X版本,因为可能10.4.4(2006),32位,64位,Python 2和Python的3。 GetFileInfo的版本(从2009年开始)是一个"通用" i386 + PPC二进制文件。
GetFileInfo是Xcode的一部分,它很大,但您可以单独下载命令行工具(请参阅"单独下载"部分here)。