Selenium Python打包exe报错:AttributeError: 'NoneType'无write属性
问题:爬虫代码打包为exe后运行出现AttributeError错误
我编写的网页爬虫直接运行完全正常,但打包成可执行文件(exe)后运行时报错,错误栈如下:
Traceback (most recent call last): File "Robo Ajuste Norber.py", line 77, in <module> File "webdriver_manager\chrome.py", line 39, in install File "webdriver_manager\core\manager.py", line 30, in _get_driver_path File "webdriver_manager\core\download_manager.py", line 28, in download_file File "webdriver_manager\core\http.py", line 39, in get File "webdriver_manager\core\utils.py", line 264, in show_download_progress File "tqdm\std.py", line 1095, in __init__ File "tqdm\std.py", line 1344, in refresh File "tqdm\std.py", line 1492, in display File "tqdm\std.py", line 347, in print_status File "tqdm\std.py", line 340, in fp_write File "tqdm\utils.py", line 71, in __getattr__ AttributeError: 'NoneType' object has no attribute 'write'
代码第76-80行内容见截图,求解决办法。
解决方案
这个错误是因为打包成exe后(尤其是用--windowed/--noconsole参数打包时),标准输出流stdout变为None,而webdriver_manager依赖的tqdm进度条组件试图向不存在的输出流写入内容导致的。可以通过以下几种方式解决:
方法1:禁用webdriver_manager的进度条
在代码中初始化ChromeDriverManager时,关闭日志或进度条显示:
from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.service import Service from selenium import webdriver # 设置日志级别为0关闭进度条 driver = webdriver.Chrome(service=Service(ChromeDriverManager(log_level=0).install())) # 或者通过环境变量禁用进度条 import os os.environ['WDM_PROGRESS_BAR'] = '0' driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
方法2:打包时保留控制台窗口
如果使用PyInstaller打包,不要使用--windowed或--noconsole参数,确保打包后的exe保留控制台输出:
pyinstaller "Robo Ajuste Norber.py" --onefile
如果必须使用无窗口模式,可以在代码中手动为tqdm指定输出流:
import sys from tqdm import tqdm # 手动指定tqdm的输出流为stderr,避免stdout为None的问题 tqdm_out = sys.stderr tqdm.write = lambda msg: print(msg, file=tqdm_out)
方法3:手动下载ChromeDriver并打包到exe中
跳过webdriver_manager的自动下载,手动下载对应版本的ChromeDriver,将其和代码放在同一目录,打包时包含进去,代码中直接指定Driver路径:
from selenium.webdriver.chrome.service import Service from selenium import webdriver # 假设chromedriver.exe和exe在同一目录 driver = webdriver.Chrome(service=Service('./chromedriver.exe'))
内容的提问来源于stack exchange,提问作者Felipe Gomes
相关产品推荐
相关产品推荐

