Python pip: ImportError cannot import name 'ensure_str' from 'six'. On multiple pip commands

cdath picture cdath · May 11, 2020 · Viewed 9.9k times · Source

I noticed that something was wrong when I first wanted to install the tqdm package for python3. Running pip install tqdm i revieved

ImportError: cannot import name 'ensure_str' from 'six' (/home/carl/.local/lib/python3.8/site-packages/six.py).

There seem to be a similar problem when running a variety of pip commands such as pip freeze and pip list, but not pip show [package] or pip -h.

I am unure where to start and what to make of the situation and would greatly appreciate help. I will post the full trace below for context.

Full traceback: pip install [any package]

Traceback (most recent call last):
  File "/usr/bin/pip", line 11, in <module>
    load_entry_point('pip==20.0.2', 'console_scripts', 'pip')()
  File "/usr/lib/python3.8/site-packages/pip/_internal/cli/main.py", line 73, in main
    command = create_command(cmd_name, isolated=("--isolated" in cmd_args))
  File "/usr/lib/python3.8/site-packages/pip/_internal/commands/__init__.py", line 96, in create_command
    module = importlib.import_module(module_path)
  File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/usr/lib/python3.8/site-packages/pip/_internal/commands/install.py", line 24, in <module>
    from pip._internal.cli.req_command import RequirementCommand
  File "/usr/lib/python3.8/site-packages/pip/_internal/cli/req_command.py", line 20, in <module>
    from pip._internal.operations.prepare import RequirementPreparer
  File "/usr/lib/python3.8/site-packages/pip/_internal/operations/prepare.py", line 16, in <module>
    from pip._internal.distributions import (
  File "/usr/lib/python3.8/site-packages/pip/_internal/distributions/__init__.py", line 2, in <module>
    from pip._internal.distributions.wheel import WheelDistribution
  File "/usr/lib/python3.8/site-packages/pip/_internal/distributions/wheel.py", line 5, in <module>
    from pip._internal.utils.wheel import pkg_resources_distribution_for_wheel
  File "/usr/lib/python3.8/site-packages/pip/_internal/utils/wheel.py", line 12, in <module>
    from pip._vendor.six import PY2, ensure_str
ImportError: cannot import name 'ensure_str' from 'six' (/home/carl/.local/lib/python3.8/site-packages/six.py) 

Traceback: pip freeze

Traceback (most recent call last):
  File "/usr/bin/pip", line 11, in <module>
    load_entry_point('pip==20.0.2', 'console_scripts', 'pip')()
  File "/usr/lib/python3.8/site-packages/pip/_internal/cli/main.py", line 73, in main
    command = create_command(cmd_name, isolated=("--isolated" in cmd_args))
  File "/usr/lib/python3.8/site-packages/pip/_internal/commands/__init__.py", line 96, in create_command
    module = importlib.import_module(module_path)
  File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/usr/lib/python3.8/site-packages/pip/_internal/commands/freeze.py", line 12, in <module>
    from pip._internal.operations.freeze import freeze
  File "/usr/lib/python3.8/site-packages/pip/_internal/operations/freeze.py", line 17, in <module>
    from pip._internal.req.constructors import (
  File "/usr/lib/python3.8/site-packages/pip/_internal/req/__init__.py", line 11, in <module>
    from .req_file import parse_requirements
  File "/usr/lib/python3.8/site-packages/pip/_internal/req/req_file.py", line 25, in <module>
    from pip._internal.req.constructors import (
  File "/usr/lib/python3.8/site-packages/pip/_internal/req/constructors.py", line 28, in <module>
    from pip._internal.req.req_install import InstallRequirement
  File "/usr/lib/python3.8/site-packages/pip/_internal/req/req_install.py", line 30, in <module>
    from pip._internal.operations.install.wheel import install_wheel
  File "/usr/lib/python3.8/site-packages/pip/_internal/operations/install/wheel.py", line 33, in <module>
    from pip._internal.utils.wheel import parse_wheel
  File "/usr/lib/python3.8/site-packages/pip/_internal/utils/wheel.py", line 12, in <module>
    from pip._vendor.six import PY2, ensure_str
ImportError: cannot import name 'ensure_str' from 'six' (/home/carl/.local/lib/python3.8/site-packages/six.py)

EDIT: I was suggested to look at https://stackoverflow.com/a/57262415/13516940. And It says that 'ensure_str' is included in six 1.12 and forward, however I only have version 1.11. This explains why it cant be found. However I cannot fix this by for example running pip install --upgrade six nor pip uninstall six or pip check six. Because any of those commands give the same "cannot import name" error. Help to solve this would be greatly appreciated.

Answer

Mike Davlantes picture Mike Davlantes · Jan 22, 2021

I had this problem within my virtual environment when installing from the requirements.txt file that came with the code. My system Python (3.8.5) ran just fine and on the system I had six==1.14.0, but the requirements.txt file had six==1.11.0. Thus, whenever I ran pip install -r requirements.txt within my venv things would break because it would install the older version of six.

My solution was to delete the first venv I created, change the line in requirements.txt to six==1.14.0 (the working version), rebuild my venv, and then install using the newly modified requirements.txt file. In hindsight this seems like common sense, but in the moment it didn't occur to me. In short: don't overwrite the working version of six with the older, non-compatible version.