Python AttributeError: 'module' object has no attribute 'Serial' Python错误:'module'对象没有属性'Serial'

172
我正试图在运行 Debian 的树莓派上,用 Python 2.6 访问串口。 我的脚本名为 serial.py,试图导入 pySerial 模块。
import serial
ser = serial.Serial('/dev/ttyAMA0', 9600)
ser.write("hello world!")

因为某种原因它拒绝建立串行连接,并显示以下错误:

AttributeError: 'module' object has no attribute 'Serial'

当我尝试在交互式Python解释器中输入相同的代码时,它仍然无法工作。

奇怪的是,几个小时前它还能工作。

问题可能是什么?我已经尝试了一段时间来修复这个问题,重新安装pySerial,重写我的代码,双重检查串口等。


6
你尝试过使用from serial import serial吗? - mVChr
1
这些代码中哪一行在交互式Python解释器中无法工作? - Ashwini Chaudhary
请参见https://dev59.com/vGIj5IYBdhLWcg3w8ZYF。 - benathon
1
请修改正确的解决方案。你标记的那个可能是偶然成功了,但它既不是解决方案,也不是你想要做的事情。 - erikbstack
2
将你的脚本重命名为其他名称! - Behzad
显示剩余5条评论
7个回答

223

我为那些和我犯了同样错误的人提供这个解决方案。

在大多数情况下: 重新命名您的项目文件serial.py并删除serial.pyc(如果存在),然后您可以轻松执行import serial而不会出现属性错误。

当您导入“something”时,如果您的Python文件名是“something.py”,就会出现问题。


5
没错,我把测试文件命名为"serial.py",所以导入serial时导入的是它本身。 - PedroMorgan
1
对于GAE用户的额外提示 - 尝试刷新memcache。不知何故,将模型移动到另一个文件后遇到了这个问题,并且被困扰了很长时间。不确定是什么被缓存导致了这个问题,但刷新解决了它。 - OJFord
非常好!这个答案帮了我很多,谢谢! - Ren
2
这个答案应该是#1,我也遇到了同样的问题。另一个出现的错误是AttributeError: 'module' object has no attribute 'SerialException' - user287107
另外,检查是否存在名为 serial 的(子)目录 :-) - handle
显示剩余5条评论

212

我不小心安装了'serial' (sudo python -m pip install serial),而不是'pySerial' (sudo python -m pip install pyserial),这导致了相同的错误。

如果之前提到的解决方案对你没有起作用,请再次检查你是否安装了正确的库。


12
解决方法是卸载两者,然后重新安装 pyserial。 - jcaron
22
谢谢,使用 pip uninstall serial 卸载串行端口解决了我的问题。然后安装了 pyserial,命令为 pip install pyserial - Dardan Iljazi
6
另外,删除“serial”(或“pip3…”)后,使用“pip install --upgrade --force-reinstall pyserial”可能会有所帮助。 - handle
避免使用 sudo pip...。这通常会创建只有 root 可读的文件并破坏您的 Python 安装。此外,它还会使您的全局环境混乱。建议使用 pip install --user 或者使用 虚拟环境 - jozxyqk

138
您正在导入模块,而不是类。因此,您必须编写:
from serial import Serial

您需要正确安装 serial 模块: pip install pyserial


3
在导入模块时,我遇到了几次相同的问题。我不明白为什么有些情况下它可以工作(例如当您查看serial网站中的一些示例时)。 - VGO
38
我尝试了,但是没有起作用。出现了错误信息:“ImportError: cannot import name serial”。 - Zhang LongQI
23
很抱歉,这看起来完全不对。首先,类应该是Serial而不是serial,然后您不必导入一个类才能使用它,module.class()应该可以很好地工作。最后但并非最不重要的一点是,这里根本没有真正解释正在发生什么。 - erikbstack
这并没有解决所描述的问题,也不应该被接受。导入模块而不是类是完全可以的,因为代码可以从模块中显式地访问类。如果直接导入类,则必须修改其余代码以匹配。再次强调,这并不改变将文件命名为“serial.py”会导致问题的事实。 - Karl Knechtel
@Kevin,PyPI用于软件包的名称不需要和Python理解的“包名称”匹配,通常也不会匹配。这不是一个观点问题。使用pip install pyserial获取的软件包需要使用代码 import serial,而不能使用 import pyserial的代码。 - Karl Knechtel

48

您安装了名为'serial'的错误包。

  • 对于Python 2.x,请运行pip uninstall serial,对于Python 3.x,请运行pip3 uninstall serial
  • 然后,如果尚未安装,则安装pyserial,方法是运行pip install pyserial(针对Python 2.x)或pip3 install pyserial(针对Python 3.x)。

2
如果您和我一样无助,请尝试以下方法:
按照这里描述的方法列出“Serial”(或其他您遇到问题的包)的所有子模块:列出一个Python包中的所有模块 在我的情况下,问题一个接一个地得到解决。
...看起来像是一个错误...

这个解决方案的作用还不清楚。我们列出了包中的模块...然后呢?什么是“问题”,以及它们是如何被解决的?这与OP中描述的具体问题有什么关系? - Karl Knechtel
@KarlKnechtel 这是8年前的事了,我不记得了。但我可以为您阅读我的答案:如何?毫无头绪。这与主题有什么关系?它解决了他/她的问题(摆脱错误消息),如果这是我遇到的同样问题,那么它似乎是一样的。 - Nearoo

1

如果您存在循环依赖,也可能出现此错误。请检查您的导入并确保没有任何循环。


1

是的,这个话题有点老了,但我想分享一下对我有效的解决方案,以便那些可能需要它的人。

正如Ali所说,尝试使用终端从以下位置定位您的程序:

 sudo python3
 import serial

print(serial.__file__) --> 复制

CTRL+D #(退出python)

sudo python3 -->粘贴/__init__.py

运行__init__.py将告诉你的程序“好的,我要使用Python3的串行”。我的问题是我的Python3程序正在使用Python 2.7的串行。

其他解决方案:删除其他Python版本

Cao

来源: https://raspberrypi.stackexchange.com/questions/74742/python-serial-serial-module-not-found-error/85930#85930

努力尝试


这个回答是无意义的;没有所谓“激活”一个__init__.py文件。 - Karl Knechtel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接