编辑:MacOS Sonoma 版本 14.2.1
我正在通过 crontab 运行 python 脚本,并且脚本运行,但在尝试迭代 ~/.Trash 目录时出现错误:
PermissionError: [Errno 1] Operation not permitted: '/Users/me/.Trash'
我已经启用了完整磁盘访问:/usr/sbin/cron、/usr/bin/crontab 和terminal.app,但仍然有同样的问题。
如果我直接运行命令,它工作正常,但是当 cron 运行它时,我收到上面的错误。我尝试了一些不同的 crontab 条目,但从所有这些条目中得到了相同的结果(我直接运行了每个版本,并且每个版本在不通过 cron 运行时都工作正常)。
*/5 * * * * /Users/me/miniforge3/envs/dev/bin/fclean >> /dev/null 2>&1
*/5 * * * * /Users/me/miniforge3/envs/dev/bin/python /Users/me/miniforge3/envs/dev/bin/fclean >> /dev/null 2>&1
*/5 * * * * /Users/me/miniforge3/envs/dev/bin/python /Users/me/path/to/file.py >> /dev/null 2>&1
如果有帮助的话,引发权限问题的Python函数是:
def clean_folder(folder: Path, _time: int = days(30)) -> None:
"""
If a file in the specified path hasn't been accessed in the specified days; remove it.
Args:
folder (Path): Path to folder to iterate through
_time (int): optional time parameter to pass as expiration time.
Returns:
None
"""
for file in folder.iterdir():
if expired(file, _time):
try:
rm_files(file)
except PermissionError as permission:
logging.exception(permission)
continue
except Exception as _err:
logging.exception(_err)
continue
我在苹果开发者论坛中交叉发布了这个问题:这里
在其中一个回复中,我链接到了一个非常好的线索,它有助于解释正在发生的一些事情:这里
这是最适合这种情况的片段。
脚本
MAC 给脚本编写带来了一些严峻的挑战,因为脚本是由解释器运行的,系统无法区分解释器完成的文件系统操作和脚本完成的操作。例如,如果您有一个脚本需要操作桌面上的文件,您就不会希望授予解释器该权限,因为任何脚本都可以执行此操作。
此问题最简单的解决方案是将脚本打包为 MAC 可用于跟踪的独立程序。这可能很容易也可能很困难,具体取决于特定的脚本环境。例如,AppleScript 可以轻松地将脚本导出为签名应用程序,但对于 shell 脚本而言并非如此。
我能够为 python 解释器提供全磁盘访问,并允许 cron 运行 python 脚本并访问 ~/.Trash 目录。
正如 @eskimo1 在文章中指出的那样 - 这意味着在该环境中运行的任何脚本都具有完全磁盘访问权限。所以我将来会考虑为我的脚本创建一个包。