我创建了以下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启动时设置?