某些文件操作的Python PermissionError

时间:2017-01-22 03:16:08

标签: windows python-3.x

我创建了以下Python 3.5脚本:

import sys
from pathlib import Path

def test_unlink():
    log = Path('log.csv')

    fails = 0
    num_tries = int(sys.argv[1])
    for i in range(num_tries):
        try:
            log.write_text('asdfasdfasdfasdfasdfasdfasdfasdf')

            with log.open('r') as logfile:
                lines = logfile.readlines()
                # Check the second line to account for the log file header
                assert len(lines) == 1

            log.unlink()
            not log.exists()

        except PermissionError:
            sys.stdout.write('! ')
            sys.stdout.flush()
            fails += 1

    assert fails == 0, '{:%}'.format(fails / num_tries)


test_unlink()

并按照以下方式运行:python test.py 10000。在使用Python 3.5.2的Windows 7 Pro 64上,故障率不为0:它很小,但非零。有时,它甚至不是那么小:5%!如果您打印出例外,那就是:

PermissionError: [WinError 5] Access is denied: 'C:\\...\\log.csv'

但它有时会发生在exists(),有时会发生在write_text(),如果它发生在unlink()和open(),我也不会感到惊讶。

请注意,相同的脚本,相同的Python(3.5.2),但在linux上(通过http://repl.it/),没有此问题:失败率为0.

我意识到可能的解决方法可能是:

while True: 
    try: log.unlink()
    except PermissionError: pass
    else: break

但是这很乏味且容易出错(Path实例上的几个方法需要这个,很容易忘记),并且(IMHO)不应该是必要的,所以我不认为这是实用的解决方案。

那么,有没有人对此有一个解释,一个实际的解决方法,也许是一个模式标志,可以在Python启动时设置?

0 个答案:

没有答案