没有写权限时,Python tempfile.TemporaryFile 在 Windows 上挂起

JDM*_*JDM 5 windows temporary-files python-3.x

我的环境是 Python 3.7.2,在 Windows 10 上运行。我正在研究目录选择小部件,我正在寻找最干净+最可靠的方法来测试所选目录路径是否允许写入权限。

以前我一直用通常的open()方法打开一个命名文件,向它写入几个字节,然后删除它——把整个东西放在一个try-except块中。这没关系,但它冒着留下不需要的文件的风险。最近我遇到了 的文档tempfile.TemporaryFile(),这似乎是获得相同结果的更简洁的方法,而且没有在系统上留下垃圾文件的风险。

问题是,tempfile.TemporaryFile()当它给出dir一个只读文件夹的参数时,它会挂在我的系统上。我在谷歌上搜索并发现了这个非常古老的错误,但它是针对 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)
Run Code Online (Sandbox Code Playgroud)

当我运行这个脚本时,它挂在最后一行并就在那里(任务管理器显示 Python 消耗了大约 10-15% 的 CPU)。

视窗 CMD

有谁知道问题可能是什么?特别是这是一个 Python 错误,还是我的TemporaryFile?

如果有帮助,以下是 Windows 为每个文件夹显示的特定权限:

权限

JDM*_*JDM 7

比我最初做的更深入的研究找到了答案。这确实是一个 Python bug,前段时间报告过,但仍有待解决。

eryksun的评论描述了细节——这促使我仔细研究 Python 错误数据库——所以最终这就是值得赞扬的地方。我只是在这里填写它以获得问题的答案并结束。

tempfile.TemporaryFile该错误仅影响 Windows 环境,但不幸的是,对于这种常见用例,它会导致在 Windows 上无法使用。