tempfile.NamedTemporaryFile创建临时文件在windows没有权限打开

06 Feb 2018 tempfile.NamedTemporaryFile创建临时文件在windows没有权限打开

记录下来是因为当时谷歌这个问题时发现,网上也有很多人遇到这个问题,我也因为这个问题导致了一个bug,所以告诫自己以后使用API多仔细看看文档。

python的tempfile模块用于创建系统临时文件,是一个很有用的模块。通过tempfile.NamedTemporaryFile,可以轻易的创建临时文件,并返回一个文件对象,文件名可以通过对象的name属性获取,且创建的临时文件会在关闭后自动删除。下面这段python代码创建一个临时文件,并再次打开该临时文件,写入数据,然后再次打开,读取文件,并按行打印文件内容。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import tempfile


# create tmp file and write it
tmp_file = tempfile.NamedTemporaryFile()
print 'tmp file is {self.name}'.format(self=tmp_file)

with open(tmp_file.name, 'w') as f:
    f.write("line 1\nline 2\nline 3\n")


# user tmp file
with open(tmp_file.name) as f:
    for line in f.readlines():
        print line

在linux上运行上面的python代码,会创建一个临时文件,且程序退出后该临时文件会自动删除,输出如下:

root@master:demo$ python tmp_file.py
tmp file is /tmp/tmpb3EYGV
line 1

line 2

line 3

但是在windows上运行时,提示没有权限,不能打开创建的临时文件,是不是感觉很奇怪。

E:\share\git\python_practice\demo>tmp_file.py
tmp file is c:\users\leo\appdata\local\temp\tmphn2kqj
Traceback (most recent call last):
  File "E:\share\git\python_practice\demo\tmp_file.py", line 11, in <module>
    with open(tmp_file.name, 'w') as f:
IOError: [Errno 13] Permission denied: 'c:\\users\\leo\\appdata\\local\\temp\\tm
phn2kqj'

查看官方文档,该API解释如下:

tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])
This function operates exactly as TemporaryFile() does, except that the file is guaranteed to have a visible name in the file system (on Unix, the directory entry is not unlinked). That name can be retrieved from the name attribute of the returned file-like object. Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot on Windows NT or later). If delete is true (the default), the file is deleted as soon as it is closed.
The returned object is always a file-like object whose file attribute is the underlying true file object. This file-like object can be used in a with statement, just like a normal file.
New in version 2.3.
New in version 2.6: The delete parameter.

注意其中的一句话:

Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot on Windows NT or later).

大概意思是,当这个临时文件处于打开状态,在unix平台,该名字可以用于再次打开临时文件,但是在windows不能。所以,如果要在windows打开该临时文件,需要将文件关闭,然后再打开,操作完文件后,再调用os.remove删除临时文件。

参考:https://docs.python.org/2/library/tempfile.html

LEo at 00:05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玄魂工作室

看代码学PHP渗透(3) - 实例化任意对象漏洞

大家好,我们是红日安全-代码审计小组。最近我们小组正在做一个PHP代码审计的项目,供大家学习交流,我们给这个项目起了一个名字叫 PHP-Audit-Labs 。...

6951
来自专栏安恒信息

Hacking Team分析(二) 沙箱对抗分析

0x00背景 在Hacking Team泄露的文件中含有不少后门、木马的源码,其中就包含有一些反虚拟机反沙箱的代码, 如scout-win-master中就涉及...

5134
来自专栏安恒网络空间安全讲武堂

bugkuctf_web_writeup(部分)--上

bugkuctf平台10个较简单的web题目writeup,适合新手入门,可以找来试试http://ctf.bugku.com/bbs 。 Web2 题目描述:...

9055
来自专栏芋道源码1024

源码级别解读 mybatis 插件

简介: ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以...

3898
来自专栏Android 研究

Android系统启动——2init进程

严格上讲,Android系统实际上是运行于Linux内核之上的一系列"服务进程",并不算一个完成意义上的"操作系统";而这一系列进程是维持Android设备正常...

2282
来自专栏有趣的django

35.Django2.0文档

第四章 模板  1.标签 (1)if/else {% if %} 标签检查(evaluate)一个变量,如果这个变量为真(即,变量存在,非空,不是布尔值假),系...

58410
来自专栏C++

python笔记:#002#第一个python程序

1194
来自专栏前端那些事

Express4.x API (三):Response (译)

Express4.x API 译文 系列文章 技术库更迭较快,很难使译文和官方的API保持同步,更何况更多的大神看英文和中文一样的流畅,不会花时间去翻译--,所...

17510
来自专栏性能与架构

Redis案例 - 事件提醒

场景 任务是 当 redis set 中有新元素时及时处理 需要在set有新元素后自动得到通知,省得使用轮询的方式来查看是否有新元素 相当于对set做一...

3598
来自专栏安智客

GP TEE中的几种存储方式介绍

我们知道TEEOS最重要的功能莫过于安全存储了,这是一切安全的前提,根据存储安全性和使用场景GP TEE安全存储分为RPMB安全存储、SFS安全存储和SQLFS...

4896

扫码关注云+社区

领取腾讯云代金券