我知道有很多这样的问题,但我就是找不到正确的答案。
我已将我的 Mac 更新到 macOS Catalina,我在 IDLE 中使用 Python 3.7.9,但无法访问我的照片库。
import os
os.listdir("/Users/me/Pictures/Photos Library.photoslibrary")
这会引发错误:
Traceback (most recent call last):
File "/Users/me/mycode.py", line 2, in <module>
os.listdir("/Users/me/Pictures/Photos Library.photoslibrary")
PermissionError: [Errno 1] Operation not permitted: '/Users/me/Pictures/Photos Library.photoslibrary'
我可以使用终端执行代码:
$ python "/Users/me/mycode.py"
这可行,但我更喜欢在 IDLE 中执行我的代码,但它不起作用。
我执行这个:
$ ls -l "/Users/me/Pictures"
已退回:
drwxrwxrwx@ 13 me group 416 Jan 2 10:10 Photos Library.photoslibrary
在系统偏好设置 > 安全和隐私 > 隐私中, IDLE 已在“完整磁盘访问”和“照片”中,并且两者均带有复选标记。 我还在开发者工具中添加了 Finder。
在终端中我执行了这段代码:
$ sudo chown me:group "/Users/me/Pictures/Photos Library.photoslibrary"
还是不行。
我不知道该怎么做才能解决这个问题。
请帮助我,谢谢。
偶然发现了至少在这里对我有用的答案,https://cleanmymac.com/blog/operation-not-permission-terminal,
是从“系统偏好设置 > 安全和隐私 > 隐私 > 全磁盘访问”为终端应用程序提供“全磁盘访问”。 (我使用的是 Macos Monterey“12.4”)
我只能访问 16 个特殊十六进制目录中的第一个,
"/Users/me/Pictures/Photos Library.photoslibrary/originals/0"
,但神秘的是其他目录都无法访问 1, 2,..., E, F
# (replaced my name with "me" below)
workdir = "/Users/me/Pictures/Photos Library.photoslibrary/originals"
[str(x) for x in (Path(workdir) / "0").glob("*")][:5]
['/Users/me/Pictures/Photos Library.photoslibrary/originals/0/0D1F85D7-627E-49A6-B108-65EF9BB46681.heic',
'/Users/me/Pictures/Photos Library.photoslibrary/originals/0/0FB4B6E0-22D3-4601-B524-8708A18B1B10.jpeg',
'/Users/me/Pictures/Photos Library.photoslibrary/originals/0/04122C50-1648-43CC-A325-DDF72C2F1FE3.jpeg',
'/Users/me/Pictures/Photos Library.photoslibrary/originals/0/048D0DF3-F9D5-4DB6-B1F1-DE1C54A2786F.jpeg',
'/Users/me/Pictures/Photos Library.photoslibrary/originals/0/082F4E1D-C222-47F3-99EA-9D7501848B6B.jpeg']
另外,我发现这个,https://github.com/muxcmux/apple-photos-forensics,是一个关于解释的有趣资源
/Users/me/Pictures/Photos Library.photoslibrary/database/Photos.sqlite
,例如当我跑步时,
select * from ZASSET
我得到了 11773 行,其中包含上述文件名作为“ZFILENAME”列。 (所以下面,我只是使用一个函数
run_query
,它使用 python 的内置 sqlite3
来运行查询)
In [153]: sql = "select ZUUID, ZFILENAME from ZASSET "
...: df = run_query("Photos.sqlite", sql)
...: print(df.shape)
...: df.head()
(11773, 2)
Out[153]:
ZUUID ZFILENAME
0 54ACC8C9-A682-4A4C-A4F1-E1808DBF8B0A 54ACC8C9-A682-4A4C-A4F1-E1808DBF8B0A.JPG
1 162CBC99-72D3-44AD-AB4E-9FC1909BCFA6 162CBC99-72D3-44AD-AB4E-9FC1909BCFA6.JPG
2 182AD204-814A-4E0E-94D1-6E9D7A9ED26B 182AD204-814A-4E0E-94D1-6E9D7A9ED26B.JPG
3 5C0D5113-9017-4E5A-BB67-EF875F99B906 5C0D5113-9017-4E5A-BB67-EF875F99B906.JPG
4 576C9DCB-71A1-4AEF-A4C8-6EC4B561AFDB 576C9DCB-71A1-4AEF-A4C8-6EC4B561AFDB.JPG
我在从 Mac OS Catalina 访问照片库时遇到了同样的问题。 通过设置终端照片完全磁盘访问来解决:“系统设置>隐私和安全>照片>终端 - 完全访问”
我假设使用更有限的“照片”访问权限比为终端提供完整的全磁盘访问权限更安全。
您的 Python 可能无权访问该目录。也许进入并将您的 Visual Studio、终端或 xTerm 设置为具有完整的磁盘访问权限,如本文所述。
https://osxdaily.com/2018/10/09/fix-operation-not-permissed-terminal-error-macos/