selenium chromedriver:chrome.exe打开python logging filehandler文件

时间:2015-06-18 11:01:45

标签: python google-chrome logging webdriver selenium-chromedriver

我设置了记录器处理程序,然后启动了chrome webdriver。尝试旋转日志文件时会出现[错误32],因为它无法重命名日志文件。我发现Chrome会打开日志文件。

我更改了设置记录器的顺序并启动了chrome webdriver.It将成功旋转日志文件。当我的脚本重新启动chrome时,错误再次发生。我每次启动时都必须设置logger.handlers = []新的chrome webdriver实例。

我尝试 - 禁用日志记录,但它不起作用。

为什么chrome.exe会打开python logging filehandler的日志文件?

是否有任何解决方案可以避免chrome打开日志文件?

这是我的剧本。

import time
import logging
from selenium import webdriver
from logging.handlers import TimedRotatingFileHandler

logger = logging.getLogger('m')
def set_logger():
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s: %(message)s',
                                  datefmt='%Y-%m-%d %H:%M:%S')
    rotate_file_handler = TimedRotatingFileHandler('D:\\data\\spam.log',
                                                   when='s', interval=10, backupCount=10)
    rotate_file_handler.setLevel(logging.INFO)
    rotate_file_handler.setFormatter(formatter)
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)
    console_handler.setFormatter(formatter)
    logger.addHandler(rotate_file_handler)
    logger.addHandler(console_handler)

if __name__ == '__main__':
    # change the order these two, it will work correct.
    # or set logger.handlers = [], it will work too.
    set_logger()
    b = webdriver.Chrome()

    for i in range(100):
        logger.info(i)
        time.sleep(1)

这是Traceback。(Windows 7 SP1 x86_64,python = 2.7.10,chrome = 43.0.2357.81,chromedriver = 2.15.322448)。

Traceback (most recent call last):
  File "C:\Python27\lib\logging\handlers.py", line 77, in emit
    self.doRollover()
  File "C:\Python27\lib\logging\handler.py", line 350, in doRollover
    os.rename(self.baseFilename, dfn)
WindowsError: [Error 32]
Logged from test.py, line 28

1 个答案:

答案 0 :(得分:0)

我今天遇到了同样的问题。经过一番挖掘,我发现了问题所在。

问题的根本原因在于python本身。在3.4版(包括2.x早午餐)之前,python默认情况下会创建可继承的文件描述符(据我所知,它几乎适用于所有与文件相关的操作),并且用户无法更改此行为。当selenium chromedriver通过子进程调用webdriver.exe时,日志文件处理程序将由webdriver进程继承,这将阻止日志记录翻转操作并导致错误。

根据pep-0446,此问题在3.4版中已解决。

看来,解决此问题的唯一方法是升级到python 3.4或更高版本。对于python 2.7早午餐,似乎此问题已标记为“无法解决”状态,请参见issue26769

脚本的一种解决方法是避免使用TimedRotatingFileHandler,这样它就不会旋转并触发错误。