16

platform: ubuntu 17.04 server

The ubuntu 17.04 server installation includes python 2.7 and python 3.5. I installed the Python 3.6.3 manually from source. However, lsb_release -a failed:

# lsb_release -a
Traceback (most recent call last):
  File "/usr/bin/lsb_release", line 25, in <module>
    import lsb_release
ModuleNotFoundError: No module named 'lsb_release'

But if I modify the first line of the file lsb_release from

#!/usr/bin/python3 -Es

to

#!/usr/bin/python3.5 -Es

it works again.

# lsb_release -a
LSB Version:    core-9.20160110ubuntu5-amd64:core-9.20160110ubuntu5-noarch:security-9.20160110ubuntu5-amd64:security-9.20160110ubuntu5-noarch
Distributor ID: Ubuntu
Description:    Ubuntu 17.04
Release:    17.04
Codename:   zesty

Here are the module search path:

# python3.5
Python 3.5.3 (default, Sep 14 2017, 22:58:41) 
[GCC 6.3.0 20170406] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages']
>>> import lsb_release
>>> exit()

# python3
Python 3.6.3 (default, Oct 14 2017, 20:35:42) 
[GCC 6.3.0 20170406] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/local/lib/python36.zip', '/usr/local/lib/python3.6', '/usr/local/lib/python3.6/lib-dynload', '/root/.local/lib/python3.6/site-packages', '/usr/local/lib/python3.6/site-packages']
>>> import lsb_release
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'lsb_release'
>>> exit()

Does anyone know how to fix it?

4
  • 1
    I think you should probably just rm /usr/local/bin/python3, and use python3.6 explicitly if you want to use 3.6 for something.
    – dobey
    Oct 15 '17 at 14:49
  • Why are you installing Python 3.6 from source?
    – edwinksl
    Oct 15 '17 at 15:54
  • It looks like you set up a different Python installation as the default in your Ubuntu system. This is known to lead to a lot of trouble because of different module installation paths. What's the output of readlink -f /usr/bin/python3 and /usr/bin/python3 --version? Oct 15 '17 at 16:23
40

Solution:

sudo ln -s /usr/share/pyshared/lsb_release.py /usr/local/lib/python3.6/site-packages/lsb_release.py

Explain:

We can see in /usr/bin/lsb_release

#!/usr/bin/python3 -Es

# lsb_release command for Debian
# (C) 2005-10 Chris Lawrence <lawrencc@debian.org>
#    This package is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; version 2 dated June, 1991.
#    This package is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#    You should have received a copy of the GNU General Public License
#    along with this package; if not, write to the Free Software
#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
#    02110-1301 USA
from optparse import OptionParser
import sys
import os
import re

import lsb_release

The key step is import lsb_release, but the problem is Python 3.6 doesn't have this module.

So, you must have overrided python3 from python3.5 to python3.6. That's why your lsb_release is broken.

To verify it, we can see in python3.6:

➜  ~ python3.6 
Python 3.6.4 (default, Feb  6 2018, 16:57:12) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import lsb_release
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'lsb_release'

then in python3.5:

➜  ~ python3.5
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import lsb_release
>>> lsb_release.__file__
'/usr/lib/python3/dist-packages/lsb_release.py'

where is this file:

➜  ~ ll /usr/lib/python3/dist-packages/lsb_release.py
lrwxrwxrwx 1 root root 38 Jul   7  2016 /usr/lib/python3/dist-packages/lsb_release.py -> ../../../share/pyshared/lsb_release.py

So, this module lsb_release exist in python3.5 but not exist in python3.6. And We find it eventually!

Now let's fix it through add a link to the original lsb_release.py file!

It works for me!

2
  • I got another error after added a link to the original lsb_release.py ImportError: cannot import name 'get_lsb_information'
    – Jason Liu
    Aug 20 '20 at 15:47
  • Is pyshared a folder for backwards compatibility? The ln solution seems like a hack for newer python versions on ubuntu.
    – Timo
    Sep 21 at 7:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.