Python快速创build和删除目录将间歇性地导致WindowsError

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

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

 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意味着访问被拒绝 。 networking上的很多解释引用了缺乏pipe理权限的原因,就像这个MSDNpost一样 。 但是原因与访问权无关。 当我在Administrator command prompt运行scrapy crawl命令时,问题仍然存在。

然后我创build了一个像这样的小testing来尝试在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中试过这个testing脚本,这个错误从来没有发生过。 我也在另一台Windows机器上尝试了相同的代码,并在那里发生。

这有什么可能的原因?

[更新]certificate屏幕截图[pipe理员指中文pipe理员]: 在这里输入图像说明

还certificate在pipe理员命令提示符下testing用例仍然失败:

在这里输入图像说明

@ pss说他不能重现这个问题。 我试了我们的Windows 7服务器。 我安装了一个新的Python 2.7.10 64位新的。 我不得不为一轮设定一个非常大的上限,而只是在1996年一轮之后才开始出现错误:

在这里输入图像说明

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

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

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