如何用Python将PIL生成的图片复制到macOS剪贴板?
解决PIL图片复制到macOS剪贴板的问题
你遇到的CFURL错误是因为原osascript代码依赖本地文件路径,但你想直接用内存中的PIL图片数据而非本地文件。可以通过将PIL图片转为base64编码,再用AppleScript解码并设置到剪贴板的方式解决,无需保存图片到本地。
具体实现代码:
import base64 from io import BytesIO from PIL import Image import subprocess # 替换为你的实际PIL图片对象 pil_image = Image.new("RGB", (200, 200), "blue") # 将PIL图片转为PNG格式的内存字节流 image_buffer = BytesIO() pil_image.save(image_buffer, format="PNG") # 编码为base64字符串,实现跨语言数据传递 image_base64 = base64.b64encode(image_buffer.getvalue()).decode("utf-8") # 构造AppleScript脚本:解码base64并设置剪贴板 applescript_code = f''' set base64_str to "{image_base64}" set image_data to decode_base64(base64_str) set the clipboard to image_data on decode_base64(str) return run script "return current application's NSData's dataWithBase64EncodedString:(str) options:0" with parameters {{str}} as «class PNGf» end decode_base64 ''' # 调用osascript执行脚本 subprocess.run(["osascript", "-e", applescript_code], check=True)
核心逻辑说明:
- 用
BytesIO将PIL图片转为内存字节流,避免本地文件IO操作 - 通过base64编码实现Python与AppleScript之间的二进制数据传递
- AppleScript借助
NSData解码base64数据,转换为PNG格式后直接写入剪贴板
这种方式完全绕开了本地文件路径的依赖,自然解决了CFURL相关的报错。
内容的提问来源于stack exchange,提问作者Another_coder
相关产品推荐
相关产品推荐

