这是一个版本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 https://stackoverflow.com/questions/21244781/what-replaces-the-now-deprecated-carbon-file-fsresolvealiasfile-in-python-on-osx我希望得到答案。现在我不能做得比使用更好子流程调用 http://docs.python.org/3/library/subprocess.html to 调用在命令行上进行检查的东西 https://stackoverflow.com/questions/1175094/os-x-terminal-command-to-resolve-path-of-an-alias/17570232#17570232.
编辑:我应该补充一点,Carbon.File 不仅在 Python 3 中不可用,而且已被弃用,因此最好在 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 http://python.6.x6.nabble.com/Creator-type-and-other-means-of-file-detection-td2157634.html)