使用Python os.sendfile触发OSError: [Errno 38] 问题排查
关于os.sendfile在macOS上报错的问题解析
macOS系统下的os.sendfile()实现遵循BSD规范,和Linux版本存在差异:它要求第一个参数(目标文件描述符)必须是套接字(socket),而你传入的是普通文件的描述符,这就是触发OSError: [Errno 38] Socket operation on non-socket错误的原因。
你参考的内容大概率基于Linux环境——Linux的sendfile支持普通文件之间的内容传输,但macOS的实现仅允许将数据从普通文件发送到套接字,无法直接在两个普通文件间使用该方法。
如果你的需求是复制文件内容,推荐以下两种更可靠的替代方案:
方案1:手动读写实现指定字节复制
import os f1 = os.open('f1.txt', os.O_RDONLY) f2 = os.open('f2.txt', os.O_RDWR | os.O_CREAT) # 读取指定100字节并写入目标文件 data = os.read(f1, 100) os.write(f2, data) os.close(f1) os.close(f2)
方案2:使用shutil模块(更简洁)
如果不需要精确控制传输字节数,shutil模块的方法更适合文件复制场景:
import shutil shutil.copyfile('f1.txt', 'f2.txt')
内容的提问来源于stack exchange,提问作者Igor Belykh
相关产品推荐
相关产品推荐

