gpt4 book ai didi

Python 快速创建和删除目录会间歇性导致 WindowsError [错误 5]

转载 作者:太空狗 更新时间:2023-10-29 20:30:26 30 4
gpt4 key购买 nike

我在使用Scrapy的FifoDiskQueue时遇到了这个问题。在 Windows 中,FifoDiskQueue 将导致目录和文件由一个文件描述符创建并由另一个文件描述符使用(如果队列中没有更多消息,则删除)。

我会随机收到如下错误信息:

2015-08-25 18:51:30 [scrapy] INFO: Error while handling downloader output
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 588, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "C:\Python27\lib\site-packages\scrapy\core\engine.py", line 154, in _handle_downloader_output
self.crawl(response, spider)
File "C:\Python27\lib\site-packages\scrapy\core\engine.py", line 182, in crawl
self.schedule(request, spider)
File "C:\Python27\lib\site-packages\scrapy\core\engine.py", line 188, in schedule
if not self.slot.scheduler.enqueue_request(request):
File "C:\Python27\lib\site-packages\scrapy\core\scheduler.py", line 54, in enqueue_request
dqok = self._dqpush(request)
File "C:\Python27\lib\site-packages\scrapy\core\scheduler.py", line 83, in _dqpush
self.dqs.push(reqd, -request.priority)
File "C:\Python27\lib\site-packages\queuelib\pqueue.py", line 33, in push
self.queues[priority] = self.qfactory(priority)
File "C:\Python27\lib\site-packages\scrapy\core\scheduler.py", line 106, in _newdq
return self.dqclass(join(self.dqdir, 'p%s' % priority))
File "C:\Python27\lib\site-packages\queuelib\queue.py", line 43, in __init__
os.makedirs(path)
File "C:\Python27\lib\os.py", line 157, in makedirs
mkdir(name, mode)
WindowsError: [Error 5] : './sogou_job\\requests.queue\\p-50'

在 Windows 中,错误 5 表示访问被拒绝。网上很多解释都引用了没有管理权限的原因,比如this MSDN post .但原因与访问权限无关。当我在管理员命令提示符中运行scrapy crawl命令时,问题仍然存在。

然后我创建了一个像这样的小测试来尝试在 windows 和 linux 上:

#!/usr/bin/python

import os
import shutil
import time

for i in range(1000):
somedir = "testingdir"
try:
os.makedirs(somedir)
with open(os.path.join(somedir, "testing.txt"), 'w') as out:
out.write("Oh no")
shutil.rmtree(somedir)
except WindowsError as e:
print 'round', i, e
time.sleep(0.1)
raise

当我运行它时,我会得到:

round 13 [Error 5] : 'testingdir'
Traceback (most recent call last):
File "E:\FHT360\FHT360_Mobile\Source\keywordranks\test.py", line 10, in <module>
os.makedirs(somedir)
File "C:\Users\yj\Anaconda\lib\os.py", line 157, in makedirs
mkdir(name, mode)
WindowsError: [Error 5] : 'testingdir'

round 每次都不一样。所以如果我最后删除 raise,我会得到这样的东西:

round 5 [Error 5] : 'testingdir'
round 67 [Error 5] : 'testingdir'
round 589 [Error 5] : 'testingdir'
round 875 [Error 5] : 'testingdir'

它只是随机失败,概率很小,仅在 Windows 中。我在 cygwin 和 linux 上试过这个测试脚本,这个错误从来没有发生过。我还在另一台 Windows 机器上尝试了相同的代码,它出现在那里。

这可能是什么原因?

[更新]证明截图【管理人员中文意思是Administrator】: enter image description here

同时在管理员命令提示符下证明测试用例仍然失败:

enter image description here

@pss 说他无法重现这个问题。我尝试了我们的 Windows 7 服务器。我安装了全新的 python 2.7.10 64 位。我必须为 round 设置一个非常大的上限,并且在 19963 round 之后才开始看到错误出现:

enter image description here

最佳答案

简而言之:禁用任何防病毒软件或文档索引,或者至少将它们配置为不扫描您的工作目录。

长:您可以花费数月时间尝试解决此类问题,到目前为止,唯一不涉及禁用防病毒软件的解决方法是假设您将无法删除所有文件或目录。

在您的代码中假定这一点,并在服务启动时尝试使用不同的根子目录,并尝试清理旧的子目录,忽略删除失败。

关于Python 快速创建和删除目录会间歇性导致 WindowsError [错误 5],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32243199/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com