jazzband / pip-tools

A set of tools to keep your pinned Python dependencies fresh.
https://pip-tools.rtfd.io
BSD 3-Clause "New" or "Revised" License
7.74k stars 612 forks source link

"TypeError: cannot use a string pattern on a bytes-like object" while installing django-geojson #2118

Open khink opened 3 months ago

khink commented 3 months ago

Not sure if this is an issue with pip-tools or (django-)geojson, but ill start asking here:

In our base.in we have django-geojson.

Today while running pip-compile i ran into this error:

CUSTOM_COMPILE_COMMAND="make requirements" env/bin/pip-compile --upgrade --resolver=backtracking --generate-hashes --allow-unsafe --output-file requirements/production.txt requirements/production.in
    error: subprocess-exited-with-error

    × python setup.py egg_info did not run successfully.
    │ exit code: 1
    ╰─> [16 lines of output]
        Traceback (most recent call last):
          File "<string>", line 2, in <module>
          File "<pip-setuptools-caller>", line 34, in <module>
          File "/tmp/pip-resolve-8epq73d1/geojson_f8da4ae3298f497286137c89d8d975c6/setup.py", line 6, in <module>
            setup(name          = "geojson",
          File "/home/kees/Projects/eov-2.0-api/env/lib/python3.9/site-packages/setuptools/__init__.py", line 108, in setup
            return distutils.core.setup(**attrs)
          File "/home/kees/Projects/eov-2.0-api/env/lib/python3.9/site-packages/setuptools/_distutils/core.py", line 146, in setup
            _setup_distribution = dist = klass(attrs)
          File "/home/kees/Projects/eov-2.0-api/env/lib/python3.9/site-packages/setuptools/dist.py", line 300, in __init__
            self.metadata.version = self._normalize_version(self.metadata.version)
          File "/home/kees/Projects/eov-2.0-api/env/lib/python3.9/site-packages/setuptools/dist.py", line 336, in _normalize_version
            normalized = str(Version(version))
          File "/home/kees/Projects/eov-2.0-api/env/lib/python3.9/site-packages/packaging/version.py", line 198, in __init__
            match = self._regex.search(version)
        TypeError: cannot use a string pattern on a bytes-like object
        [end of output]

    note: This error originates from a subprocess, and is likely not a problem with pip.

Pinning django-geojson==4.0.0 (the currently used version) fixes it.

This might be due to a new django-geojson release (https://pypi.org/project/django-geojson/4.1.0/), but I can't see anything wrong with its setup.py (https://github.com/makinacorpus/django-geojson/blob/4.1.0/setup.py)

The stacktrace above lists setup(name = "geojson", which i think is a string parsing error, as geojson is not a dependency of django-geojson, nor has it been.

Environment Versions

Steps to replicate

Edit: Easy reproduction steps at https://github.com/khink/pip-tools-issue-2118

In short: Run pip-compile on this requirements file

RonnyPfannschmidt commented 3 months ago

This is a bug in the project, nothing pip can do about a broken package

khink commented 3 months ago

Hi, first off: thanks for taking the time to look into this!

pip install django-geojson==4.1.0 just works. How can i show the django-geojson maintainers what is wrong?

Edit: The error above seems to indicate it fails in the python setup.py egg_info step, but the following just works:

git clone git@github.com:makinacorpus/django-geojson.git
cd django-geojson/
git checkout 4.1.0
python3.11 -m venv env
. env/bin/activate
python setup.py egg_info

Not sure how to reproduce the error.

AndydeCleyre commented 3 months ago

I can't reproduce with this info yet, but can you ensure you're using the latest setuptools in the venv with the problem?

khink commented 3 months ago

Thanks for thinking of that.

Turns out it was a recent setuptools: 71.1.0. I just upgraded it and tried again:

$ pip install --upgrade setuptools
Requirement already satisfied: setuptools in ./env/lib/python3.9/site-packages (71.1.0)
Collecting setuptools
  Downloading setuptools-72.1.0-py3-none-any.whl.metadata (6.6 kB)
Downloading setuptools-72.1.0-py3-none-any.whl (2.3 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.3/2.3 MB 2.6 MB/s eta 0:00:00
Installing collected packages: setuptools
  Attempting uninstall: setuptools
    Found existing installation: setuptools 71.1.0
    Uninstalling setuptools-71.1.0:
      Successfully uninstalled setuptools-71.1.0
Successfully installed setuptools-72.1.0

However, same result.

I created this repo to reproduce it: https://github.com/khink/pip-tools-issue-2118

Apparently the bug only surfaces in combination with these other requirements.

AndydeCleyre commented 3 months ago

Great! OK, so I can confirm that this reproduces here, and it's failing on processing django-geojson 1.2.0, and can be worked around by making the requirement django-geojson>1.2.0. And also that a plain:

$ pip install django-geojson==1.2.0

fails the same way. It looks like that version depends on an uninstallable version of geojson.

pip-tools should probably just reject a failed version like this and keep trying others.