Skip to content

pkg_resource deprecated #286

Open
Open

Description

@0-wiz-0

setuptools 67 deprecated pkg_resource, and in 82 it was removed, leading to:

* Building wheel...
Traceback (most recent call last):
  File "/opt/pkg/lib/python3.11/site-packages/pyproject_hooks/_in_process/_in_process.py", line 389, in <module>
    main()
  File "/opt/pkg/lib/python3.11/site-packages/pyproject_hooks/_in_process/_in_process.py", line 373, in main
    json_out["return_val"] = hook(**hook_input["kwargs"])
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/pkg/lib/python3.11/site-packages/pyproject_hooks/_in_process/_in_process.py", line 280, in build_wheel
    return _build_backend().build_wheel(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/pkg/lib/python3.11/site-packages/setuptools/build_meta.py", line 438, in build_wheel
    return _build(['bdist_wheel'])
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/pkg/lib/python3.11/site-packages/setuptools/build_meta.py", line 429, in _build
    return self._build_with_temp_dir(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/pkg/lib/python3.11/site-packages/setuptools/build_meta.py", line 410, in _build_with_temp_dir
    self.run_setup()
  File "/opt/pkg/lib/python3.11/site-packages/setuptools/build_meta.py", line 520, in run_setup
    super().run_setup(setup_script=setup_script)
  File "/opt/pkg/lib/python3.11/site-packages/setuptools/build_meta.py", line 317, in run_setup
    exec(code, locals())
  File "<string>", line 3, in <module>
ModuleNotFoundError: No module named 'pkg_resources'

when trying to build it.

Workaround:

--- setup.py.orig       2026-02-17 15:06:10.418245753 +0000
+++ setup.py
@@ -1,12 +1,9 @@
 # Distutils script for python-xlib

-from pkg_resources import parse_requirements
 from setuptools import (__version__ as setuptools_version, setup)


 # Check setuptools is recent enough to support `setup.cfg`.
-setuptools_require = next(parse_requirements('setuptools>=30.3.0'))
-assert setuptools_version in setuptools_require, '{} is required'.format(setuptools_require)


 setup(

Activity

  1. loqs commented on Feb 24, 2026

    @loqs

    @0-wiz-0 Have you considered preserving the version check for backwards compatibility possible:

    --- a/setup.py
    +++ b/setup.py
    @@ -1,12 +1,13 @@
     # Distutils script for python-xlib
     
    -from pkg_resources import parse_requirements
    +from packaging.requirements import Requirement
     from setuptools import (__version__ as setuptools_version, setup)
     
     
     # Check setuptools is recent enough to support `setup.cfg`.
    -setuptools_require = next(parse_requirements('setuptools>=30.3.0'))
    -assert setuptools_version in setuptools_require, '{} is required'.format(setuptools_require)
    +setuptools_require = Requirement('setuptools>=30.3.0')
    +assert setuptools_require.specifier.contains(setuptools_version), \
    +    '{} is required (found {})'.format(setuptools_require, setuptools_version)
     
     
     setup(

    Or attempt to preserve compatibility back to python 2.7:

    --- a/setup.py
    +++ b/setup.py
    @@ -1,12 +1,20 @@
     # Distutils script for python-xlib
     
    -from pkg_resources import parse_requirements
    -from setuptools import (__version__ as setuptools_version, setup)
    -
    +try:
    +    from packaging.requirements import Requirement
    +except ImportError:
    +    from pkg_resources import parse_requirements
    +    def Requirement(req_str):
    +        return next(parse_requirements(req_str))
     
     # Check setuptools is recent enough to support `setup.cfg`.
    -setuptools_require = next(parse_requirements('setuptools>=30.3.0'))
    -assert setuptools_version in setuptools_require, '{} is required'.format(setuptools_require)
    +setuptools_require = Requirement('setuptools>=30.3.0')
    +
    +if hasattr(setuptools_require, 'specifier'):
    +    assert setuptools_require.specifier.contains(setuptools_version)
    +else:
    +
    +    assert setuptools_version in setuptools_require
     
     
     setup(

    What did you do for runtests.py?

    --- a/runtests.py
    +++ b/runtests.py
    @@ -10,7 +10,16 @@ import sys
     import tempfile
     import textwrap
     
    -from pkg_resources import load_entry_point
    +def get_entry_point(group, name):
    +    try:
    +        eps = entry_points(group=group, name=name)
    +    except TypeError:
    +        eps = entry_points().get(group, [])
    +
    +    if isinstance(eps, dict):
    +        return next(ep for ep in eps if ep.name == name)
    +
    +    return next(iter(eps))
     
     
     class SigException(BaseException):
    @@ -50,10 +59,18 @@ def tests_run(display, authfile=None):
             sys.executable,
             '-c', textwrap.dedent(
                 '''
    -            from pkg_resources import load_entry_point
    -            sys.exit(load_entry_point(
    -                'nose', 'console_scripts', 'nosetests',
    -            )())
    +            try:
    +                from importlib.metadata import entry_points
    +            except ImportError:
    +                from importlib_metadata import entry_points
    +
    +            try:
    +                ep = next(iter(entry_points(group='console_scripts', name='nosetests')))
    +            except TypeError:
    +                ep = next(ep for ep in entry_points().get('console_scripts', []) if ep.name == 'nosetests')
    +
    +            import sys
    +            sys.exit(ep.load()())
                 '''
             ).lstrip(),
             '--exe', '--with-xunit', '--verbosity=3',
    @@ -68,7 +85,7 @@ def tests_run(display, authfile=None):
         print('running tests: `{0}`'.format(' '.join(cmd)))
         sys.argv = cmd
         try:
    -        load_entry_point('nose', 'console_scripts', 'nosetests')()
    +        get_entry_point('console_scripts', 'nosetests').load()()
         except SystemExit as err:
             code = err.code
         else:
  2. 0-wiz-0 commented on Feb 25, 2026

    @0-wiz-0
    Author

    Sure, preserving the check is nicer.
    I'm not interested in Python 2.7 compatibility.
    I didn't touch runtests.py because I use pytest to run the tests, that seems to work fine, so I didn't notice.
    But please go ahead and commit your versions!
    Thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions