click-plugins icon indicating copy to clipboard operation
click-plugins copied to clipboard

Entry points can not be loaded if there is a package version conflict anywhere in the environment

Open cpaulik opened this issue 5 years ago • 7 comments

If any package dependency is not met the entry point fails to load. Even if this does not impact the functioning of the CLI at all

Could this be replaced by a warning?

E.g.

 Traceback (most recent call last):
  File "/opt/conda/envs/vds-37/lib/python3.7/site-packages/click_plugins/core.py", line 37, in decorator
    group.add_command(entry_point.load())
  File "/opt/conda/envs/vds-37/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2442, in load
    self.require(*args, **kwargs)
  File "/opt/conda/envs/vds-37/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2465, in require
    items = working_set.resolve(reqs, env, installer, extras=self.extras)
  File "/opt/conda/envs/vds-37/lib/python3.7/site-packages/pkg_resources/__init__.py", line 791, in resolve
    raise VersionConflict(dist, req).with_context(dependent_req)
pkg_resources.ContextualVersionConflict: (docutils 0.16 (/opt/conda/envs/vds-37/lib/python3.7/site-packages), Requirement.parse('docutils<0.16,>=0.10'), {'botocore'})

cpaulik avatar Feb 20 '20 14:02 cpaulik

Related: https://github.com/pypa/setuptools/issues/1826

Possible fixes would be using:

  • importlib-metadata : include:https://importlib-metadata.readthedocs.io/en/latest/
  • entrypoints: https://github.com/takluyver/entrypoints

AndrewHoos avatar Nov 09 '20 19:11 AndrewHoos

@AndrewHoos This is helpful information – thanks.

I'll try and spend some time on this in the near future. I did make an attempt several months ago but hit some potential issues and murkiness in my understanding of how entrypoints work. I do think this is worth addressing if possible.

geowurster avatar Dec 12 '20 01:12 geowurster

If all you are doing is listing and loading entry points:

# Replace this
from pkg_resources import iter_entry_points
# with This
from entrypoints import get_group_all

The entry points have a .name and .load() which was enough for me. Bonus points it ran in about 40% of the pkg_resources API.

AndrewHoos avatar Dec 18 '20 22:12 AndrewHoos

So far, the solution that @AndrewHoos proposed with entrypoints works great. Are you open to update the documentation with this solution?

teije01 avatar Apr 19 '21 11:04 teije01

Is there any news on progress on this issue (or associated PR https://github.com/click-contrib/click-plugins/pull/32)?

We've recently updated to Celery 5.2.3 (which uses this click-plugins package) and are running into this problem (although in our case it's a clash with setuptools since Celery decided to tightly pin it)

Warning: entry point could not be loaded. Contact its author for help.
2022-01-10T11:33:01.647435486Z 
2022-01-10T11:33:01.647436986Z
2022-01-10T11:33:01.647438630Z Traceback (most recent call last):
2022-01-10T11:33:01.647440188Z   File "/usr/local/lib/python3.10/site-packages/click_plugins/core.py", line 37, in decorator
2022-01-10T11:33:01.647456725Z     group.add_command(entry_point.load())
2022-01-10T11:33:01.647458198Z   File "/usr/local/lib/python3.10/site-packages/pkg_resources/__init__.py", line 2449, in load
2022-01-10T11:33:01.647459768Z     self.require(*args, **kwargs)
2022-01-10T11:33:01.647461372Z   File "/usr/local/lib/python3.10/site-packages/pkg_resources/__init__.py", line 2472, in require
2022-01-10T11:33:01.647462998Z     items = working_set.resolve(reqs, env, installer, extras=self.extras)
2022-01-10T11:33:01.647464519Z   File "/usr/local/lib/python3.10/site-packages/pkg_resources/__init__.py", line 777, in resolve
2022-01-10T11:33:01.647473224Z     raise VersionConflict(dist, req).with_context(dependent_req)
2022-01-10T11:33:01.647474930Z pkg_resources.ContextualVersionConflict: (setuptools 57.5.0 (/usr/local/lib/python3.10/site-packages), Requirement.parse('setuptools<59.7.0,>=59.1.1'), {'celery'})

amrishparmar avatar Jan 10 '22 12:01 amrishparmar

For anyone still reading this thread and using the solution posted by @andrewhoos, since entrypoints is now in maintenance-only mode it is better to replace from entrypoints import get_group_all with from importlib_metadata import entry_points and then replace get_group_all("foo") with entry_points(group="foo")

valentinsulzer avatar Nov 29 '22 23:11 valentinsulzer

Thanks for the suggestion @tinosulzer, seems to work fine.

teije01 avatar Jan 06 '23 14:01 teije01