如何修复此AttributeError:Python3.8中的'NoneType'对象没有属性'fileno'

问题描述

我正在使用Pick包在我的IDLE终端中创建基于诅咒的交互式选择列表。这是我目前拥有的代码

from pick import pick
title = 'Please choose your favorite programming language: '
options = ['Java','JavaScript','Python','PHP','C++','Erlang','Haskell']
option,index = pick(options,title)
print(option)
print(index)

但是,我遇到以下错误

Python 3.8.5 (tags/v3.8.5:580fbb0,Jul 20 2020,15:57:54) [MSC v.1924 64 bit (AMD64)] on win32
Type "help","copyright","credits" or "license()" for more @R_842_4045@ion.
>>> 
= RESTART: C:\Users\haneg\OneDrive\Documents\Python-Scripts\Restrictieenzymen.py
---
Traceback (most recent call last):
  File "C:\Users\haneg\OneDrive\Documents\Python-Scripts\Restrictieenzymen.py",line 5,in <module>
    option,title)
  File "C:\Users\haneg\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\python38\site-packages\pick\__init__.py",line 195,in pick
    return picker.start()
  File "C:\Users\haneg\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\python38\site-packages\pick\__init__.py",line 181,in start
    return curses.wrapper(self._start)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1520.0_x64__qbz5n2kfra8p0\lib\curses\__init__.py",line 84,in wrapper
    stdscr = initscr()
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1520.0_x64__qbz5n2kfra8p0\lib\curses\__init__.py",line 30,in initscr
    fd=_sys.__stdout__.fileno())
AttributeError: 'nonetype' object has no attribute 'fileno'

如果我直接在Python中运行此代码而没有IDLE,则不会出现此错误。有人对如何解决此问题有任何建议吗?任何帮助表示赞赏!

解决方法

涉及IDLE,但仅作为GUI应用程序使用,通常不从命令行启动。

  1. 当前的错误是尝试访问.fileno而没有捕获AttributeError并正常退出。您可以向pick个人提及。这种情况并非IDLE独有。

  2. 更深层的错误正在尝试在发生错误的环境中运行curses。 IDLE doc中未提及sys。 stdxxx 的情况。您可以通过在控制台中使用> python -m idlelib启动IDLE来修复 this 。 (这应该在文档中更加清楚。)在Windows上执行此操作时,我得到了预期的文件编号。

    >>> import sys;
    >>> sys.__stderr__.fileno()
    2
  1. stdlib curses被记录为仅限Unix。如果pick在Windows上运行,则必须包含足以满足其需求的内容。

从命令提示符或PowerShell运行足以满足您的需求,但我还有另外两个想法可以在将来帮助其他人。我在这里要注意不要忘记。

  1. 添加新的机制来检查错误类和消息。对于这种情况,ff AttributeError和模板匹配,并且object为Nonetype且attribute为std stream属性,请添加IDLE特定的附录,以建议修复。

  2. 向新的Run => Run ... customized菜单对话框中添加一个选项,以在系统终端中运行(对于那些未在终端中启动IDLE的用户)。我第一次尝试失败,但是这个问题增加了另一个用例。所以我应该再试一次。