在Python 2中,我可以使用以下代码来解析MacOS别名或符号链接:
from Carbon import File File.FSResolveAliasFile(alias_fp, True)[0].as_pathname()
其中alias_fp是我很好奇的文件的路径,存储为字符串(source)。
但是,文档欣喜地告诉我,不赞成使用整个Carbon系列模块。我应该改用什么?
编辑:我相信下面的代码是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
(来源)
不幸的是,我无法使用@Milliways的解决方案(对可可一无所知),而我在互联网上其他地方发现的东西看起来要复杂得多(也许它正在处理各种边缘情况?)。
PyObjC桥使您可以访问NSURL的书签处理,这是别名的现代(向后兼容)替代:
import os.path from Foundation import * def target_of_alias(path): url = NSURL.fileURLWithPath_(path) bookmarkData, error = NSURL.bookmarkDataWithContentsOfURL_error_(url, None) if bookmarkData is None: return None opts = NSURLBookmarkResolutionWithoutUI | NSURLBookmarkResolutionWithoutMounting resolved, stale, error = NSURL.URLByResolvingBookmarkData_options_relativeToURL_bookmarkDataIsStale_error_(bookmarkData, opts, None, None, None) return resolved.path() def resolve_links_and_aliases(path): while True: alias_target = target_of_alias(path) if alias_target: path = alias_target continue if os.path.islink(path): path = os.path.realpath(path) continue return path