Anže's Blog

Python, Django, and the Web

16 Nov 2022

Fixing _SixMetaPathImporter.find_spec() not found warnings in Python 3.10

I am helping a client upgrade their Django application to Python 3.10 and we encountered this mysterious warning when running the app on the new Python version:

<frozen importlib._bootstrap>:914: ImportWarning: _SixMetaPathImporter.find_spec() not found; falling back to find_module()

To make matters worse, this warning doesn’t only show up once, but more than 200 times when we run python manage.py runserver. It completely floods the console output 😱

A fair amount of googling revealed that the warnings are coming from the six library. Luckily, they patched the issue in version 1.16.0. We just have to make sure we are running the latest version!

But something isn’t right, running pip show six shows:

Name: six
Version: 1.16.0
Summary: Python 2 and 3 compatibility utilities
Home-page: https://github.com/benjaminp/six
Author: Benjamin Peterson
...

We seem to be all up to date! But why are we still getting the warning spam? 🤔

Vendored Six

It turns out, it is common for packages to vendor six. This means that even though we have six 1.16.0 installed, the package has its version embedded that might be out-of-date.

To find the packages with the old version we came up with the following grep command:

grep -r '__author__ = "Benjamin Peterson' -A 1 venv 

The command searches through your virtualenv folder for any lines containing the line __author__ = "Benjamin Peterson, which is a line from the six library. There might be some false positives if you have some other Benjamin’s packages installed, but there were no such packages in our case.

The -A 1 argument makes grep print the line after the matched line, which in this case happens to be six’s version number.

The problematic packages are the ones where the version string is lower than 1.16.0:

venv/lib/python3.10/site-packages/boto/vendored/six.py:__author__ = "Benjamin Peterson <benjamin AT python DOT org>"
venv/lib/python3.10/site-packages/boto/vendored/six.py-__version__ = "1.9.0"
--
venv/lib/python3.10/site-packages/snowflake/connector/vendored/urllib3/packages/six.py:__author__ = "Benjamin Peterson <benjamin AT python DOT org>"
venv/lib/python3.10/site-packages/snowflake/connector/vendored/urllib3/packages/six.py-__version__ = "1.16.0"
--
venv/lib/python3.10/site-packages/botocore/vendored/six.py:__author__ = "Benjamin Peterson <benjamin AT python DOT org>"
venv/lib/python3.10/site-packages/botocore/vendored/six.py-__version__ = "1.10.0"
--
venv/lib/python3.10/site-packages/pip/_vendor/six.py:__author__ = "Benjamin Peterson <benjamin AT python DOT org>"
venv/lib/python3.10/site-packages/pip/_vendor/six.py-__version__ = "1.16.0"
--
venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/six.py:__author__ = "Benjamin Peterson <benjamin AT python DOT org>"
venv/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/six.py-__version__ = "1.16.0"
--
venv/lib/python3.10/site-packages/six.py:__author__ = "Benjamin Peterson <benjamin AT python DOT org>"
venv/lib/python3.10/site-packages/six.py-__version__ = "1.16.0"
--
venv/lib/python3.10/site-packages/newrelic/packages/six.py:__author__ = "Benjamin Peterson <benjamin AT python DOT org>"
venv/lib/python3.10/site-packages/newrelic/packages/six.py-__version__ = "1.3.0"
--
venv/lib/python3.10/site-packages/newrelic/packages/urllib3/packages/six.py:__author__ = "Benjamin Peterson <benjamin AT python DOT org>"
venv/lib/python3.10/site-packages/newrelic/packages/urllib3/packages/six.py-__version__ = "1.16.0"
--
venv/lib/python3.10/site-packages/urllib3/packages/six.py:__author__ = "Benjamin Peterson <benjamin AT python DOT org>"
venv/lib/python3.10/site-packages/urllib3/packages/six.py-__version__ = "1.16.0"

Unfortunately, there is no way to update a vendored six library. The only solution is for the author of the package to publish a new version with updated six. If you are already on the latest version of the package you might have to open an issue on the package’s GitHub page or better yet, open a pull request that updates the version yourself.

In our case we had to remove the boto package (it hasn’t been maintained in years) and upgrade botocore to the latest version. newrelic also has an out-of-date version vendored, but it doesn’t seem to be emitting any warnings and we left it be for now.

More mystery errors

Adam Johnson wrote a blog post on searching through the virtualenv folder for mystery error messages that’s also worth a read!