为何tempfile.TemporaryFile在AWS ECS/Docker中显示无效路径?
为什么tempfile.TemporaryFile().name跨平台表现不同?
在Linux这类Unix-like系统(包括你的ECS Docker容器)里,tempfile.TemporaryFile()创建的是匿名临时文件——这种文件不会在文件系统里生成可访问的路径,name属性返回的只是文件描述符(就是你看到的数字6)。而Windows不支持匿名文件,所以TemporaryFile()只能创建带实际路径的可见临时文件,name自然就是完整路径了,这就是两者差异的核心原因。
怎么解决?
如果需要把临时文件的路径传给外部函数(比如s3.download_file),别用TemporaryFile(),换成tempfile.NamedTemporaryFile()就行——它在所有平台都会生成带有效路径的临时文件。
修改后的代码
import tempfile import boto3 # 默认情况下,文件会在with块结束后自动删除 with tempfile.NamedTemporaryFile() as tmpfile: s3 = boto3.client('s3') # 这里tmpfile.name是有效的文件路径,能被s3.download_file正常识别 s3.download_file("my_bucket", "my_object", tmpfile.name) # 如果需要读取下载的内容,先把文件指针移到开头 tmpfile.seek(0) file_content = tmpfile.read() # 退出with块后文件自动删除,不用手动清理
额外说明
- 如果需要在关闭文件后继续使用这个临时文件,给
NamedTemporaryFile加个delete=False参数,用完记得用os.unlink(tmpfile.name)手动删掉,不然会占磁盘空间。 - Linux下默认创建的临时文件是独占模式,如果外部函数需要以非独占方式打开,可指定
mode='wb'调整。
内容的提问来源于stack exchange,提问作者KingOtto
相关产品推荐
相关产品推荐

