什么取代了现在已弃用的Carbon.File.FSResolveAliasFile在OSX上的Python中?

2024-10-03 19:31:00 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python 2中,我可以使用以下代码来解析MacOS别名或符号链接:

from Carbon import File
File.FSResolveAliasFile(alias_fp, True)[0].as_pathname()

其中alias_fp是我感兴趣的文件的路径,存储为字符串(source)。在

但是,the documentation cheerfully tells me that the whole Carbon family of modules is deprecated。我应该用什么代替呢?在

编辑:我相信下面的代码是PyObjC方法朝正确方向迈出的一步。它不能解析别名,但似乎可以检测到它们。在

^{pr2}$

source

不幸的是,我不能让@Milliways的解决方案工作(对Cocoa一无所知),而且stuff I find elsewhere on the internet看起来要复杂得多(也许它处理各种边缘情况?)。在


Tags: the代码fromimporttruesource链接as
3条回答

这些模块使用的api似乎已被苹果弃用。您应该改用posixapi。在

os.path.realpath(FILE_OBJECT.name)

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

下面的Cocoa代码将解析alias。在

NSURL *targetOfAlias(NSURL *url) {
    CFErrorRef *errorRef = NULL;
    CFDataRef bookmark = CFURLCreateBookmarkDataFromFile (NULL, (__bridge CFURLRef)url, errorRef);
    if (bookmark == nil) return nil;
    CFURLRef resolvedUrl = CFURLCreateByResolvingBookmarkData (NULL, bookmark, kCFBookmarkResolutionWithoutUIMask, NULL, NULL, false, errorRef);
    CFRelease(bookmark);
    return CFBridgingRelease(resolvedUrl);
}

我不知道如何从Python调用Cocoa框架,但我确信有人已经做到了

下面的链接显示了解析aslias或symlinkhttps://stackoverflow.com/a/21151368/838253的代码

相关问题 更多 >