183

I'm trying to access a serial port with Python 2.6 on my Raspberry Pi running Debian. My script named serial.py tries to import pySerial:

import serial
ser = serial.Serial('/dev/ttyAMA0', 9600)
ser.write("hello world!")

For some reason it refuses to establish the serial connection with this error:

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

When I try to type the same code in the interactive Python interpreter it still doesn't work.

Strangely, it used to work about a couple hours ago.

What could be the problem? I've tried to fix this for a while, installing pySerial again, rewriting my code, double-checking the serial port, etc.

10
  • 6
    Have you tried from serial import serial? Commented Jul 9, 2012 at 22:12
  • Did you uninstall a module or change python versions? Commented Jul 9, 2012 at 22:12
  • 1
    which of these lines doesn't work in interactive Python interpreter ? Commented Jul 9, 2012 at 22:17
  • 1
    Please modify what is the correct solution. The one marked by you may have worked on accident, but is neither the solution nor something you want to do. Commented Apr 16, 2016 at 8:24
  • 2
    rename your script to something else! Commented Jul 28, 2020 at 15:03

7 Answers 7

247

I accidentally installed 'serial' (sudo python -m pip install serial) instead of 'pySerial' (sudo python -m pip install pyserial), which lead to the same error.

If the previously mentioned solutions did not work for you, double check if you installed the correct library.

Sign up to request clarification or add additional context in comments.

4 Comments

And the fix is to uninstall both, then reinstall pyserial.
Thank you, uninstall serial with pip uninstall serial fixed my problem. Then installed pyserial pip install pyserial
Additionally, pip install --upgrade --force-reinstall pyserial might help after removing serial (or pip3 ...).
Avoid sudo pip.... This will often create files only readable by root and break your python install. Moreover it clutters your global environment. Either pip install --user or use a virtual environment
227

I'm adding this solution for people who make the same mistake as I did.

In most cases: rename your project file serial.py and delete serial.pyc if exists, then you can simply do import serial without the attribute error.

Problem occurs when you import 'something' when your python file name is 'something.py'.

8 Comments

Yep.. I named my test file "serial.py" so import serial was importing itself..
Additional point for GAE users - try flushing memcache. Somehow ran into this and got stumped for ages after moving a model to a different file. Not sure what was cached that caused it, but it flush fixed it.
Wow, I never would have come up with this solution, thank you so much. Just sat here staring and indeed, I had an artifact .pyc file that was importing itself.
this answer should be #1, I had also the same problem. an alternative appearing error is AttributeError: 'module' object has no attribute 'SerialException
Also, check if there is a (sub)directory called serial :-)
|
141

You're importing the module, not the class. So, you must write:

from serial import Serial

You need to install serial module correctly: pip install pyserial.

5 Comments

I had the same problem several times while importing modules. I don't understand why it does work in some cases (for instance when you look at some examples in the serial website)
I tried. not work. The error will be "ImportError: cannot import name serial"
This looks utterly wrong, sorry. At first the class is Serial not serial, then you don't have to import a class to use it. module.class() should work very fine. Last but not least there is no real explanation for what's going on here at all.
This does not solve the problem described, and should not have been accepted. It is perfectly okay to import the module rather than the class, because the code then explicitly accesses the class from the module. If the class were imported directly, the rest of the code would have to be modified to match. And again, this does not change the fact that naming the file serial.py causes a problem.
@Kevin the names that PyPI uses for packages do not need to, and often do not, match the "package name" as understood by Python. It is not a matter of opinion. The package that you get by using pip install pyserial, requires code that says import serial, and will not work with code that says import pyserial.
55

You have installed the incorrect package named 'serial'.

  • Run pip uninstall serial for python 2.x or pip3 uninstall serial for python 3.x
  • Then install pyserial if not already installed by running pip install pyserial for python 2.x orpip3 install pyserial for python 3.x.

Comments

2

If you are helpless like me, try this:

List all Sub-Modules of "Serial" (or whatever package you are having trouble with) with the method described here: List all the modules that are part of a python package

In my case, the problems solved one after the other.

...looks like a bug to me...

2 Comments

It's not clear how this is supposed to solve the problem. We list the modules in the package... and then what? What are "the problems", and how were they solved? And how does this relate to the specific problem described in the OP?
@KarlKnechtel This was 8 years ago, I don't remember. But I can read my answer for you: How? No idea. How does this relate to the topic? It solved his/her problem (getting rid of an error message), if it was the same one I had, which appeared to me to be the case.
1

This error can also happen if you have circular dependencies. Check your imports and make sure you do not have any cycles.

Comments

1

Yes this topic is a bit old but i wanted to share the solution that worked for me for those who might need it anyway

As Ali said, try to locate your program using the following from terminal :

 sudo python3
 import serial

print(serial.__file__) --> Copy

CTRL+D #(to get out of python)

sudo python3 -->paste/__init__.py

Running __init__.py will say to your program "ok i'm going to use Serial from python3". My problem was that my python3 program was using Serial from python 2.7

Other solution: remove other python versions

Cao

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

Tryhard

1 Comment

This answer is nonsense; there is no such thing as "activating" an __init__.py file.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.