Jupyter Notebook中Spacy报UnsupportedOperation: fileno错误求助
问题:Windows 11 Conda环境下Jupyter Notebook导入Spacy报错UnsupportedOperation: fileno
在Windows 11系统的Conda环境(Python 3.9)中,使用Jupyter Notebook导入Spacy时出现UnsupportedOperation: fileno错误,但Python命令行中Spacy可正常运行。已尝试搜索相关错误信息但未找到针对性解决方案,附上错误栈信息,求解答错误原因及解决办法。
错误栈信息
UnsupportedOperation Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_4264/572880994.py in <module> ----> 1 import spacy C:\ProgramData\Anaconda3\lib\site-packages\spacy\__init__.py in <module> 4 5 # set library-specific custom warning handling before doing anything else ----> 6 from .errors import setup_default_warnings 7 8 setup_default_warnings() # noqa: E402 C:\ProgramData\Anaconda3\lib\site-packages\spacy\errors.py in <module> 1 import warnings ----> 2 from .compat import Literal 3 4 5 class ErrorsWithCodes(type): C:\ProgramData\Anaconda3\lib\site-packages\spacy\compat.py in <module> 1 """Helpers for Python and platform compatibility.""" 2 import sys ----> 3 from thinc.util import copy_array 4 5 try: C:\ProgramData\Anaconda3\lib\site-packages\thinc\__init__.py in <module> 3 4 from .about import __version__ ----> 5 from .config import registry C:\ProgramData\Anaconda3\lib\site-packages\thinc\config.py in <module> 11 from pydantic.main import ModelMetaclass 12 from pydantic.fields import ModelField ----> 13 from wasabi import table 14 import srsly 15 import catalogue C:\ProgramData\Anaconda3\lib\site-packages\wasabi\__init__.py in <module> 10 from .about import __version__ # noqa 11 ----> 12 msg = Printer() C:\ProgramData\Anaconda3\lib\site-packages\wasabi\printer.py in __init__(self, pretty, no_print, colors, icons, line_max, animation, animation_ascii, hide_animation, ignore_warnings, env_prefix, timestamp) 54 self.pretty = pretty and not env_no_pretty 55 self.no_print = no_print ----> 56 self.show_color = supports_ansi() and not env_log_friendly 57 self.hide_animation = hide_animation or env_log_friendly 58 self.ignore_warnings = ignore_warnings C:\ProgramData\Anaconda3\lib\site-packages\wasabi\util.py in supports_ansi() 262 if "ANSICON" in os.environ: 263 return True ---> 264 return _windows_console_supports_ansi() 265 266 return True C:\ProgramData\Anaconda3\lib\site-packages\wasabi\util.py in _windows_console_supports_ansi() 234 raise ctypes.WinError() 235 ---> 236 console = msvcrt.get_osfhandle(sys.stdout.fileno()) 237 try: 238 # Try to enable ANSI output support C:\ProgramData\Anaconda3\lib\site-packages\ipykernel\iostream.py in fileno(self) 306 return self._original_stdstream_copy 307 else: ---> 308 raise io.UnsupportedOperation("fileno") 309 310 def _watch_pipe_fd(self): UnsupportedOperation: fileno
错误原因
问题出在Spacy依赖的wasabi库:初始化时它会检测Windows控制台是否支持ANSI颜色输出,检测过程中调用了sys.stdout.fileno()方法。但Jupyter Notebook的标准输出是基于管道的虚拟流,并非传统控制台的文件描述符,不支持fileno()方法,因此抛出错误。而Python命令行使用原生控制台流,支持该方法,所以能正常运行。
解决办法
方法1:禁用wasabi彩色输出(推荐)
在导入Spacy前设置环境变量WASABI_NO_PRETTY=1,强制跳过ANSI检测:
import os os.environ["WASABI_NO_PRETTY"] = "1" import spacy
方法2:升级wasabi到最新版本
旧版本wasabi存在Jupyter环境兼容性问题,新版本已修复该检测逻辑。在Conda环境执行:
conda install -c conda-forge wasabi --update-deps
或用pip升级:
pip install --upgrade wasabi
方法3:临时重定向标准输出(应急方案)
导入Spacy前临时将stdout替换为支持fileno()的对象,导入完成后恢复:
import sys import tempfile # 保存原始stdout original_stdout = sys.stdout # 创建临时文件作为临时输出 with tempfile.TemporaryFile(mode='w+') as temp_file: sys.stdout = temp_file import spacy # 恢复原始stdout sys.stdout = original_stdout
内容的提问来源于stack exchange,提问作者user3081750
相关产品推荐
相关产品推荐

