pyFirmata 给出错误:模块“inspect”没有属性“getargspec”

问题描述 投票:0回答:3

我正在尝试使用 pyFirmata,但我无法让它工作。即使是最基本的库也不起作用。我猜库代码有问题。

from pyfirmata import Arduino,util
import time

port = 'COM5'
board = Arduino(port)

我收到此错误:

Traceback (most recent call last):
  File "c:\Users\Public\pythonpublic\arduino.py", line 5, in <module>
    board = Arduino(port)
            ^^^^^^^^^^^^^
  File "C:\Users\marce\AppData\Roaming\Python\Python311\site-packages\pyfirmata\__init__.py", line 19, in __init__      
    super(Arduino, self).__init__(*args, **kwargs)
  File "C:\Users\marce\AppData\Roaming\Python\Python311\site-packages\pyfirmata\pyfirmata.py", line 101, in __init__    
    self.setup_layout(layout)
  File "C:\Users\marce\AppData\Roaming\Python\Python311\site-packages\pyfirmata\pyfirmata.py", line 157, in setup_layout
    self._set_default_handlers()
  File "C:\Users\marce\AppData\Roaming\Python\Python311\site-packages\pyfirmata\pyfirmata.py", line 161, in _set_default_handlers
    self.add_cmd_handler(ANALOG_MESSAGE, self._handle_analog_message)
  File "C:\Users\marce\AppData\Roaming\Python\Python311\site-packages\pyfirmata\pyfirmata.py", line 185, in add_cmd_handler
    len_args = len(inspect.getargspec(func)[0])
                   ^^^^^^^^^^^^^^^^^^
AttributeError: module 'inspect' has no attribute 'getargspec'. Did you mean: 'getargs'?
python arduino attributeerror python-3.11 pyfirmata
3个回答
7
投票

正如另一个答案中已经指出的,pyFirmata 模块目前已记录在 Python 2.7、3.6 和 3.7 上运行。这并不意味着它不能在其他版本上运行,但可能是作者尚未在其他版本上进行测试并且不受官方支持。因此它可能适用于较新的 Python 版本,也可能不适用于。

您的错误消息是由于缺少功能导致的

inspect.getargspec()
。该函数是 Python 标准库的一部分,但自 Python 3.0(2008 年发布)以来已被弃用。不幸的是,作者没有意识到这一点,或者根本没有费心去修复它,所以现在代码不再适用于最新版本的 Python。

在Python文档中,您可以看到该函数在版本3.10中仍然可用,但在版本3.11中不再可用。

要解决这个问题,您有多种选择:

  • 降级到Python 3.10,目前仍然是一个不错的选择(Python 3.10“有效”到2026年10月4日)。我不知道所有其他功能是否都有效。我想会的,但你必须自己找出答案。
  • 降级到声称支持的Python 3.7。鉴于 Python 3.7 仍然存在(直到 2023 年 6 月 27 日),这也是一个合理的选择。
  • 为 pyFirmata 模块创建一个问题并希望作者解决该问题。请注意,有人在 2019 年已经创建了一个问题,但显然没有效果。您可以在那里发表评论,确认这现在已经真正损坏了。
  • 克隆库并自行修复(并创建拉取请求以将其获取到官方库中)。
  • 找到另一个与 Python 3.11 兼容的类似库。例如,pyfirmata2 是 pyFirmata 的更新版本,在撰写本文时(2023 年 11 月)正在积极支持该版本,并且不存在此问题。
  • 自己编写代码。

降级到 3.7 到 3.10 之间的 Python 版本无疑是最简单的选择,向作者留下一些反馈将使您有机会在将来修复该问题,以防您计划更长时间地使用脚本。


3
投票

根据 pyFirmata 文档的第一行

它运行在 Python 2.7、3.6 和 3.7 上

您正在使用Python 3.11。自 Python 3.7 以来,

inspect
(核心库模块)已发生变化。


3
投票

更换

len_args = len(inspect.getargspec(func)[0])

len_args = len(inspect.getfullargspec(func)[0]
© www.soinside.com 2019 - 2024. All rights reserved.