我设置了一个芹菜环境并发布了两个任务。一种是打开谷歌浏览器,另一种是简单的加法计算。加法计算功能没有问题,但是打开浏览器的功能报错,无法打开浏览器。
错误:
文件 "d:\software\professional\python27\lib\site-packages\selenium\webdriver\common\service.py", 第 95 行,在开始 (os.path.basename(self.path(, self.start_error_message, str(e(((WebDriver异常:消息:可执行的chromedriver需要 在路径中可用。请看 https://sites.google.com/a/chromium.org/chromedriver/home set_nonblocking( 在没有 setblocking(( 方法的文件对象上 (Windows 管道不支持非阻塞 I/O(
在此处输入图像描述
我的代码:(tasks.py(
# -*- coding:utf-8 -*-
from selenium import webdriver
import time
from proj.celery import app
import os
@app.task
def chrome_test():
chrome_options = webdriver.ChromeOptions()
driver_path1 = r"chromedriver"
driver_path2 = os.path.join(r"D:SoftWareProfessionalChromeDriver", "chromedriver.exe")
# print "try to open chrome..."
driver = webdriver.Chrome(executable_path=driver_path1, options=chrome_options)
# executable_path=driver_path, options=chrome_options
print "open chrome success"
driver.get("https://www.baidu.com/")
time.sleep(1)
print driver
driver.close()
return "success to open chrome..."
@app.task
def add(x, y):
time.sleep(1)
return x+y
if __name__ == "__main__":
chrome_test()
但是如果我单独运行该功能,它可以很好地工作。
此错误消息...
File "d:softwareprofessionalpython27libsite-packagesseleniumwebdrivercommonservice.py", line 95, in start (os.path.basename(self.path), self.start_error_message, str(e)))
WebDriverException: Message: The executable chromedriver needs to be available in the path. Please see https://sites.google.com/a/chromium.org/chromedriver/home set_nonblocking() on a file object with no setblocking() method (Windows pipes don't support non-blocking I/O)
。意味着您的程序在尝试启动/生成新的浏览上下文(即 Chrome 浏览器会话(时无法找到ChromeDriver。
在代码块中,您使用了:
driver = webdriver.Chrome(executable_path=driver_path1, options=chrome_options)
哪里
driver_path1 = r"chromedriver"
因此,您的程序找不到chromedriver .exe。
溶液
您需要提及ChromeDriver的绝对路径,如下所示:
driver = webdriver.Chrome(executable_path=r'D:SoftWareProfessionalChromeDriverchromedriver.exe', options=chrome_options)
或者,使用os.path.join()
您可以使用:
driver_path2 = os.path.join(r"D:SoftWareProfessionalChromeDriver", "chromedriver.exe")
driver = webdriver.Chrome(executable_path=driver_path2, options=chrome_options)
引用
您可以在以下位置找到一些相关的讨论:
- selenium.common.exceptions.WebDriverException:消息:"chromedriver"可执行文件需要在无头Chrome的PATH错误中
- WebDriver异常:消息:"chromedriver"可执行文件需要在PATH中,同时通过Selenium Chromedriver Phyton设置UserAgent。
- 错误消息:"chromedriver"可执行文件必须是 PATH
TL; DR
对子进程进行非阻塞读取。PIPE in python
我在启动"芹菜"服务时添加了参数"-P eventlet"。我遇到了这个问题,然后我删除了参数,问题就解决了。
celery -A proj worker -l info -P eventlet (old)
celery -A proj worker -l info
我怀疑窗口与"-P eventlet"和芹菜之间存在线程问题。具体原因尚不清楚。