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

2024-10-03 13:30:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Pick包在空闲终端中创建一个基于curses的交互式选择列表。这是我目前拥有的代码:

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 information.
>>> 
= 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, index = pick(options, 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,则不会出现此错误。有人对如何解决这个问题有什么建议吗?感谢您的帮助


Tags: inpytitleinitpackageslineuserscurses
1条回答
网友
1楼 · 发布于 2024-10-03 13:30:05

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

  1. 直接的错误是试图访问.fileno而不捕获AttributeError并正常退出。你可以向{}人提及这一点。这种情况并不是空闲时所特有的

  2. 更深层次的错误是试图在发生错误的环境中运行诅咒。sys.stdxxxIDLE doc中未提及的情况。您可以通过在控制台中使用> python -m idlelib启动IDLE来解决此问题。(这在文档中应该更清楚。)当我在Windows上这样做时,我得到了预期的文件号

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

从命令提示符或PowerShell运行应该就足够了,但我还有两个想法可以在将来帮助其他人。我注意到这一点是为了不忘记

  1. 添加新机制以检查错误类和消息。对于这种情况,ff AttributeError和template匹配,并且object为Nonetype,attribute为std stream属性,添加一个空闲特定的补遗

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

相关问题 更多 >