AttributeError 模块 ‘serial’ 没有属性 ‘Serial’

AttributeError 模块 ‘serial’ 没有属性 ‘Serial’

AttributeError module ‘serial’ has no attribute ‘Serial’

Python“AttributeError module ‘serial’ has no attribute ‘Serial’”发生在我们有一个命名的本地文件serial.py并从pyserial
模块导入时。

要解决该错误,请确保您没有名为 的文件serial.py,卸载serial模块并安装pyserial.

attributeerror 模块 serial 没有属性 serial

安装正确的模块

首先,确保你没有安装
串行模块而不是pyserial.

# 👇️ uninstall serial and pyserial pip uninstall serial pip uninstall pyserial pip3 uninstall serial pip3 uninstall pyserial # 👇️ install pyserial pip install pyserial pip3 install pyserial

现在尝试导入serial模块。

主程序
import serial ser = serial.Serial('/dev/ttyUSB0') print(ser.name)

确保你没有一个名为serial.py

确保您没有名为serial.py.

如果您有一个名为 的本地模块serial.py,它会隐藏第三方pyserial模块。

下面是一个示例,说明错误是如何在名为serial.py.

序列号.py
import serial ser = serial.Serial('/dev/ttyUSB0') # ⛔️ AttributeError: partially initialized module 'serial' has no # attribute 'Serial' (most likely due to a circular import). Did you mean: 'serial'? print(ser.name)

Python 解释器
首先

在内置模块中
查找导入的模块,然后在当前目录中查找,然后在 PYTHON PATH 中查找,然后在依赖于安装的默认目录中查找。

因此,当我们创建一个与第三方模块同名的本地文件时,我们实际上用我们的本地文件隐藏了官方模块。

它不必是您直接运行的文件。如果
serial.py目录中的任何位置都有文件,它会影响官方模块。

您可以访问__file__导入模块的属性以查看它是否被本地文件隐藏。

如果您的serial导入被本地文件隐藏,结果将类似于以下内容。

主程序
import serial print(serial.__file__) # ⛔️ result if shadowed by local file # /home/borislav/Desktop/bobbyhadz_python/serial.py

如果您的serial导入未被本地文件或变量覆盖,则结果将类似于以下内容。

主程序
import serial print(serial.__file__) # ✅ result if pulling in correct module # /home/borislav/Desktop/bobbyhadz_python/venv/lib/python3.10/site-packages/serial/__init__.py

开始调试的一个好方法是print(dir(your_module))查看导入的模块具有哪些属性。

序列号.py
import serial # ✅ ['__builtins__', '__cached__', '__doc__', '__file__', # '__loader__', '__name__', '__package__', '__spec__', 'serial'] print(dir(serial))

如果将模块对象传递给
dir()函数,它会返回模块属性名称的列表。

If you try to access any attribute that is not in this list, you would get the “AttributeError: module has no attribute”.

We can see that the Serial class is not present in the module’s attributes,
which is a clear indication that we are shadowing the third-party module with
our local module.

Make sure you haven’t misspelled anything in your import statement as that could
also cause the error.

Once you rename your file, you should be able to use the serial module.

main.py
import serial ser = serial.Serial('/dev/ttyUSB0') print(ser.name)

# Additional Resources

You can learn more about the related topics by checking out the following
tutorials: