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
.
安装正确的模块
首先,确保你没有安装
串行模块而不是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
.
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))
查看导入的模块具有哪些属性。
import serial # ✅ ['__builtins__', '__cached__', '__doc__', '__file__', # '__loader__', '__name__', '__package__', '__spec__', 'serial'] print(dir(serial))
如果将模块对象传递给
dir()函数,它会返回模块属性名称的列表。
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.
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: