Python关闭sys.stdout后print报ValueError的解决方法求助
问题:关闭重定向的sys.stdout后无法向控制台输出print内容
需求:将部分输出写入out.txt,关闭文件后继续用print('Hello')向控制台输出,但运行报错。
原代码
from selenium import webdriver from selenium.webdriver.common.by import By import sys print('getting contests-url') sys.stdout = open('out.txt', 'w') find_href = driver.find_elements(By.CLASS_NAME, 'discussionListItem') for my_href in find_href: print(my_href.get_attribute('id')) sys.stdout.close() print('Hello')
报错信息
print('Hello') ValueError: I/O operation on closed file.
原因
你将sys.stdout替换为了文件对象,关闭文件后,print仍会尝试使用这个已关闭的对象,导致报错。同时原代码缺少driver的初始化和网页访问步骤,会引发NameError。
解决方案
方法1:手动保存并恢复原始stdout
手动保存控制台对应的原始标准输出对象,写完文件后恢复回去:
from selenium import webdriver from selenium.webdriver.common.by import By import sys # 保存原始控制台输出对象 original_stdout = sys.stdout print('getting contests-url') # 重定向输出到文件 sys.stdout = open('out.txt', 'w') # 初始化driver并访问目标网页(根据你的浏览器调整) driver = webdriver.Chrome() driver.get("你的目标网页URL") find_href = driver.find_elements(By.CLASS_NAME, 'discussionListItem') for my_href in find_href: print(my_href.get_attribute('id')) # 关闭文件并恢复原始stdout sys.stdout.close() sys.stdout = original_stdout # 现在可以正常向控制台输出 print('Hello') # 关闭浏览器driver driver.quit()
方法2:使用contextlib.redirect_stdout(推荐)
利用Python标准库的contextlib.redirect_stdout,自动处理输出重定向和恢复,无需手动操作:
from selenium import webdriver from selenium.webdriver.common.by import By from contextlib import redirect_stdout print('getting contests-url') # 上下文管理器自动处理文件打开/关闭,以及stdout的重定向/恢复 with open('out.txt', 'w') as f: with redirect_stdout(f): driver = webdriver.Chrome() driver.get("你的目标网页URL") find_href = driver.find_elements(By.CLASS_NAME, 'discussionListItem') for my_href in find_href: print(my_href.get_attribute('id')) # 上下文结束后,stdout已自动恢复为控制台,直接输出即可 print('Hello') driver.quit()
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

