Python tempfile.TemporaryFile 在没有写权限时挂在 Windows
Python tempfile.TemporaryFile hangs on Windows when no write privilege
我的环境是 Python 3.7.2,运行ning Windows 10。我正在开发一个目录选择小部件,我正在寻找最干净的+测试所选目录路径是否允许写入权限的最可靠方法。
以前我一直用通常的 open()
方法打开一个命名文件,向它写入几个字节,然后删除它——将整个文件放在一个 try-except
块中。这没问题,但是 运行 有留下不需要的文件的风险。最近我看到了 tempfile.TemporaryFile()
的文档,这似乎是获得相同结果的更简洁的方法,而且没有在系统上留下垃圾文件的风险。
问题是,当 tempfile.TemporaryFile()
被赋予一个只读文件夹的 dir
参数时,它在我的系统上挂起。我用谷歌搜索并找到 this very old bug,但它是针对 Python 2.4 编写的,很久以前就已修复。
这是我整理的用于说明问题的测试脚本。 (请注意,我省略了我的实际应用执行的文件删除,因为它与插图无关。)
import os, tempfile
def normOpen(checkPath):
try:
with open(os.path.join(checkPath,'x.txt'),'wb') as tf:
tf.write(b'ABC')
except Exception as e:
print('Write disabled for '+checkPath)
print(str(e))
else:
print('Write enabled for '+checkPath)
def tfOpen(checkPath):
try:
with tempfile.TemporaryFile(dir=checkPath) as tf:
tf.write(b'ABC')
except Exception as e:
print('Write disabled for '+checkPath)
print(str(e))
else:
print('Write enabled for '+checkPath)
tryPath1 = 'C:\JDM\Dev_Python\TMPV\canwrite' #Full control path
tryPath2 = 'C:\JDM\Dev_Python\TMPV\nowrite' #Read-only path
print('First method - normal file-open')
normOpen(tryPath1)
normOpen(tryPath2)
print('Second method - TemporaryFile')
tfOpen(tryPath1)
tfOpen(tryPath2)
当我 运行 这个脚本时,它挂在最后一行并停在那里(任务管理器显示 Python 消耗了大约 10-15% CPU)。
有人知道问题出在哪里吗?特别是这是一个 Python 错误,还是我对 TemporaryFile
的使用有问题?
如果有帮助,下面是 Windows 为每个文件夹显示的特定权限:
比我最初所做的更深入的研究,找到了答案。这确实是 a Python bug,前段时间报告过,但仍有待解决。
来自 eryksun 的评论描述了细节——这促使我仔细研究了 Python 错误数据库——所以最终这就是功劳所在到期。我只是在这里填写它来回答问题并关闭它。
该错误仅影响 Windows 环境,但不幸的是,对于此常见用例,它的结果是 tempfile.TemporaryFile
在 Windows 上无法使用。
我的环境是 Python 3.7.2,运行ning Windows 10。我正在开发一个目录选择小部件,我正在寻找最干净的+测试所选目录路径是否允许写入权限的最可靠方法。
以前我一直用通常的 open()
方法打开一个命名文件,向它写入几个字节,然后删除它——将整个文件放在一个 try-except
块中。这没问题,但是 运行 有留下不需要的文件的风险。最近我看到了 tempfile.TemporaryFile()
的文档,这似乎是获得相同结果的更简洁的方法,而且没有在系统上留下垃圾文件的风险。
问题是,当 tempfile.TemporaryFile()
被赋予一个只读文件夹的 dir
参数时,它在我的系统上挂起。我用谷歌搜索并找到 this very old bug,但它是针对 Python 2.4 编写的,很久以前就已修复。
这是我整理的用于说明问题的测试脚本。 (请注意,我省略了我的实际应用执行的文件删除,因为它与插图无关。)
import os, tempfile
def normOpen(checkPath):
try:
with open(os.path.join(checkPath,'x.txt'),'wb') as tf:
tf.write(b'ABC')
except Exception as e:
print('Write disabled for '+checkPath)
print(str(e))
else:
print('Write enabled for '+checkPath)
def tfOpen(checkPath):
try:
with tempfile.TemporaryFile(dir=checkPath) as tf:
tf.write(b'ABC')
except Exception as e:
print('Write disabled for '+checkPath)
print(str(e))
else:
print('Write enabled for '+checkPath)
tryPath1 = 'C:\JDM\Dev_Python\TMPV\canwrite' #Full control path
tryPath2 = 'C:\JDM\Dev_Python\TMPV\nowrite' #Read-only path
print('First method - normal file-open')
normOpen(tryPath1)
normOpen(tryPath2)
print('Second method - TemporaryFile')
tfOpen(tryPath1)
tfOpen(tryPath2)
当我 运行 这个脚本时,它挂在最后一行并停在那里(任务管理器显示 Python 消耗了大约 10-15% CPU)。
有人知道问题出在哪里吗?特别是这是一个 Python 错误,还是我对 TemporaryFile
的使用有问题?
如果有帮助,下面是 Windows 为每个文件夹显示的特定权限:
比我最初所做的更深入的研究,找到了答案。这确实是 a Python bug,前段时间报告过,但仍有待解决。
来自 eryksun 的评论描述了细节——这促使我仔细研究了 Python 错误数据库——所以最终这就是功劳所在到期。我只是在这里填写它来回答问题并关闭它。
该错误仅影响 Windows 环境,但不幸的是,对于此常见用例,它的结果是 tempfile.TemporaryFile
在 Windows 上无法使用。