如何用Python获取MacOS「Utilities」文件夹内容?
问题:Mac下访问/Applications/Utilities目录仅返回.localized文件,无法获取实际应用
问题详情
- 执行
Path('/Applications/Utilities').iterdir()或os.listdir()遍历目录时,仅得到.localized这一个文件 - 访达中该目录明明显示有Disk Utility、Airport Utility等大量应用程序
- 自定义的递归查找应用函数
find_apps在其他目录(如Python 3.11文件夹)正常工作,唯独在此目录失效
函数代码示例:
def find_apps(directory_item: Path, nested_apps: list) -> None: if item_is_app(directory_item): nested_apps.append(directory_item) return if item_is_directory(directory_item): for item in directory_item.iterdir(): find_apps(item, nested_apps) return
原因分析
Mac系统中,/Applications/Utilities属于受保护的系统目录,其真实内容被系统的文件系统重定向机制转移到了/System/Applications/Utilities路径下。直接访问原路径只会进入一个包含.localized文件的“占位”目录,而非实际存放应用的位置。
解决方法
1. 访问真实路径
直接遍历/System/Applications/Utilities即可获取所有应用:
from pathlib import Path utilities_path = Path('/System/Applications/Utilities') for item in utilities_path.iterdir(): print(item.name)
2. 修改递归函数适配路径
在find_apps函数中加入路径重定向处理,自动切换到真实路径:
def find_apps(directory_item: Path, nested_apps: list) -> None: # 处理Utilities目录的系统重定向 if directory_item.resolve() == Path('/Applications/Utilities').resolve(): directory_item = Path('/System/Applications/Utilities') if item_is_app(directory_item): nested_apps.append(directory_item) return if item_is_directory(directory_item): for item in directory_item.iterdir(): find_apps(item, nested_apps)
3. 关于SIP的说明
系统完整性保护(SIP)是Mac的安全机制,禁止修改系统核心目录。不建议关闭SIP来访问原路径,这会降低系统安全性。
内容的提问来源于stack exchange,提问作者Mustafa
相关产品推荐
相关产品推荐

