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

标签 python windows scrapy

我在使用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/

相关文章:

python - Scrapy 从网站上提取表格

python - 错误代码 1 安装 Scrapy

python - 如何创建简单的 3 层神经网络并使用监督学习进行教学?

windows - Windows 8.1 64 位的 NASM 问题

windows - 用批处理在txt文件中写入图像的宽度和高度

windows - 从 Git Bash 调用 Notepad++

Python scrapy提取特定Xpath字段

python - 如何在 Keras 中强制执行(回归)模型输出的单调性?

python - Altair 分层多面图表上的滚动平均值

python - 按出现次数和字母顺序对列表进行排序